由于实验室有人用了含病毒的软件,网管把实验室出口给封了,周末人家又不上班。看样子树莓派是玩不成了,所以昨天在宿舍写windows程序,最基本的窗口程序,听说这段代码初学者至少要自己敲5遍以上。代码如下:
#include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //之前把这个回调函数的名字写成WinProc,结果编译器总是提示:未定义的标识符 汗!!!! int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("MyWindows"); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("这个程序需要在Windows NT才能执行!"), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindow(szAppName, TEXT("鱼C"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; switch (message) { case WM_PAINT: hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rect); DrawText(hdc, TEXT("大家好,这是我的第一个窗口程序!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint(hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } /* Windows窗口诞生过程 定义窗口类结构(WNDCLASS) -> 注册窗口类(RegisterClass) -> 创建窗口(CreateWindow)->显示窗口(ShowWindow) ->更新窗口(UpdateWindow)->消息循环(GetMessage->TranslateMessage->DispatchMessage)*/
当我第一次运行这段代码时,是没有问题的,成功显示了一个最基本的窗口,并且指出缩放,右上角三个按钮也都有用
但是今天凌晨同样的一段代码,运行时却报了这样一个错:
我百度(汗,*墙遇到了点困难)了一晚上,一直没找到合适的解决方案。最后,我实在没办法了,同时打开这两个工程,对着它们的配置一个个看它们的差异,这是最笨的办法了。最终找到了bug的源头:这是窗口程序,我却在配置里设置为控制台程序 所以解决方案无非两种:1.改配置,将其改为窗口程序。2.在新建一个项目时设置为窗口程序,而不是控制台程序,其实和方案一是一回事。
第一种解决方案:在工具栏的 项目-->属性-->链接器-->系统-->子系统中选择 窗口 然后保存。这样重新编译,链接就可以运行,我猜测两种不同的选择,链接器会链不同的库,如果窗口程序链的是控制台的库当然运行不了。
第二种解决方案:在新建项目的时候选择Win32项目而不是Win32控制台应用程序
好了,Windows编程之旅开始了!
时间: 2024-10-13 19:59:51