win32学习03.窗口程序

我就是我 2022-06-15 11:44 299阅读 0赞

步骤:

  1. 写WinMain函数
  2. 定义窗口处理函数(处理消息)
  3. 注册窗口类(类似于先声明再使用)RegisterClass
  4. 创建窗口(内存中创建窗口)CreateWindow
  5. 显示窗口(根据内存绘制窗口)ShowWindow/UpdateWindow
  6. 消息循环(提取/翻译/派发 消息)GetMessage/TranslateMessage/DispatchMessage
  7. 消息处理

    include

    include

    //声明窗口过程函数
    LRESULT CALLBACK WinSunProc(

    1. HWND hwnd, //窗口句柄
    2. UINT uMsg, //消息
    3. WPARAM wParam, //附加参数1
    4. LPARAM lParam //附加参数2
    5. );

    int WinMain(

    1. __in HINSTANCE hInstance,//当前程序的实例句柄,找到本进程的内存
    2. __in_opt HINSTANCE hPrevInstance, //前一个实例句柄,已经废弃,一般为NULL
    3. __in LPSTR lpCmdLine, //命令行参数字符串
    4. __in int nShowCmd //窗口的显示方式:最大化,最小化,原样。
    5. )

    {

    1. const char* ClassName = "HappyTeemo";
    2. //设计窗口类
    3. WNDCLASS wndcls;
    4. wndcls.style = CS_HREDRAW | CS_VREDRAW;
    5. wndcls.lpfnWndProc = WinSunProc;
    6. wndcls.cbClsExtra = 0;
    7. wndcls.cbWndExtra = 0;
    8. wndcls.hInstance = hInstance;
    9. wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    10. wndcls.hCursor = LoadCursor(NULL,IDC_CROSS);
    11. wndcls.hIcon = LoadIcon(NULL,IDI_ERROR);
    12. wndcls.lpszClassName = ClassName;
    13. wndcls.lpszMenuName = NULL;
    14. RegisterClass(&wndcls);//注册窗口类
    15. //创建窗口
    16. HWND hwnd;
    17. hwnd = CreateWindow
    18. (ClassName,"HappyTeemoFirstWindow",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);
    19. //显示和刷新窗口
    20. ShowWindow(hwnd,SW_SHOWNORMAL);
    21. UpdateWindow(hwnd);
    22. //定义消息结构体,开始消息循环
    23. MSG msg;
    24. while(GetMessage(&msg,NULL,0,0))
    25. {
    26. TranslateMessage(&msg);
    27. DispatchMessage(&msg);
    28. }
    29. return msg.wParam;

    }

    //窗口过程函数
    LRESULT CALLBACK WinSunProc(

    1. HWND hwnd,
    2. UINT uMsg,
    3. WPARAM wParam,
    4. LPARAM lParam
    5. )

    {

    1. switch(uMsg)
    2. {
    3. case WM_CHAR: //按下字符键
    4. char szChar[200];
    5. sprintf(szChar,"char is %d",wParam);
    6. MessageBox(hwnd,szChar,"HappyTeemo",0);
    7. break;
    8. case WM_LBUTTONDOWN://鼠标左键
    9. MessageBox(hwnd,"mouse clicked","HappyTeemo",0);
    10. HDC hdc;
    11. hdc=GetDC(hwnd);
    12. TextOut(hdc,0,50,"HappyTeemo",strlen("HappyTeemo"));
    13. ReleaseDC(hwnd,hdc);
    14. break;
    15. case WM_PAINT: //重绘
    16. HDC hDC;
    17. PAINTSTRUCT ps;
    18. hDC=BeginPaint(hwnd,&ps);
    19. TextOut(hDC,0,0,"HappyTeemo",strlen("HappyTeemo"));
    20. EndPaint(hwnd,&ps);
    21. break;
    22. case WM_CLOSE://关闭
    23. if(IDYES==MessageBox(hwnd,"Close?","HappyTeemo",MB_YESNO))
    24. {
    25. DestroyWindow(hwnd);
    26. }
    27. break;
    28. case WM_DESTROY://销毁
    29. PostQuitMessage(0);
    30. break;
    31. default:
    32. return DefWindowProc(hwnd,uMsg,wParam,lParam);
    33. }
    34. return 0;

    }

    /** 窗口类的结构体 typedef struct _WNDCLASS { UINT style;// 窗口样式 WNDPROC lpfnWndProc;//窗口处理函数,函数指针 int cbClsExtra;//附加内存,一般为0,为了开缓冲区 int cbWndExtra;//窗口附加内存,一般也为0,为了开缓冲区 HINSTANCE hInstance;//实例句柄 HICON hIcon;//窗口的图标句柄 HCURSOR hCursor;//窗口鼠标光标 HBRUSH hbrBackground;//窗口背景色 LPCTSTR lpszMenuName;//窗口菜单名 LPCTSTR lpszClassName;// 窗口类名 } WNDCLASS, LPWNDCLASS; **/

    /** //MSG结构体: typedef struct tagMSG { HWND hwnd; //句柄,属于哪个窗口的 UINT message; //消息,不同数值表示不同消息 WPARAM wParam; //附加信息1 LPARAM lParam; //附加信息2 DWORD time; //时间 POINT pt; //鼠标位置 } MSG; */

    /** HWND CreateWindow( LPCTSTR lpClassName, // registered class name,注册类的名字 LPCTSTR lpWindowName, // window name,标题栏名字 DWORD dwStyle, // window style,风格 int x, // horizontal position of window,窗口左上角x坐标 int y, // vertical position of window,窗口左上角y坐标 int nWidth, // window width,宽 int nHeight, // window height,高 HWND hWndParent, // handle to parent or owner window,父窗口句柄 HMENU hMenu, // menu handle or child identifier,菜单句柄 HINSTANCE hInstance, // handle to application instance,实例句柄 LPVOID lpParam // window-creation data,附加参数 ); */

窗口类的类别:

  1. 系统窗口类:系统定义好的,不需要注册就可以用,比如按钮(只要有形状的基本都可以算窗口)。
  2. 全局窗口类,当前应用程序所有模块可以用。
  3. 局部窗口类,本模块可以用。

注册全局的时候,需要加上CS_GLOBALCLASS风格。建议使用局部类(减少重名的麻烦)

窗口类的查找过程:

  1. 现在局部窗口类找,找到跳到2,没找到跳到3。
  2. 对比实力句柄:HINSTANCE hInstance。如果相同则表示一个进程模块,则创建返回。不相同跳到3。
  3. 全局窗口类中找,找到则创建返回。没找到则进行第四步。
  4. 系统窗口类中找,找到则创建放回。没找到则返回创建失败。

子窗口简介:
需要设置父类窗口句柄,风格增加WS_CHILD。

发表评论

表情:
评论列表 (有 0 条评论,299人围观)

还没有评论,来说两句吧...

相关阅读