欢迎光临散文网 会员登陆 & 注册

Win32 程序学习笔记_创建窗口

2022-07-09 03:18 作者:bili_98931215023  | 我要投稿

#include <windows.h>

#include <tchar.h>    //用于宽字符TCHAR操作

 

//消息处理函数的前置声明

LRESULT CALLBACK WindowsProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

 

//主函数WinMain()

int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,_In_ LPSTR CmdLine, _In_ int nShowCmd)

{

         TCHAR clsName[] = TEXT("MyWindowsClass");    //窗口类名称

        

         //设计窗口类

         WNDCLASSEX wc;

         wc.cbSize = sizeof(WNDCLASSEX);                                              //结构体的大小

         wc.style = CS_HREDRAW | CS_VREDRAW;                              //指定大小改变就水平|垂直重画

         wc.lpfnWndProc = WindowsProc;                                          //窗口回调函数指针

         wc.cbClSEXtra = 0;                                                                     //类的额外内存

         wc.cbWndExtra = 0;                                                                           //窗口的额外内存

         wc.hInstance = hInstance;                                                       //实例句柄

         wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);                   //使用预定义图标(大图标)

         wc.hCursor = LoadCursor(NULL, IDC_ARROW);             //使用预定义光标

         wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);      //使用系统颜色

         wc.lpszMenuName = NULL;                                                            //的指定菜单

         wc.lpszClassName = clsName;                                                //窗口类的名称

         wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);   //类的小图标

 

         if (!RegisterClasSEX(&wc))        //注册窗口类

                   return 0;

 

         //创建窗口

         HWND hWnd = ::CreateWindowExW(

                   0,                                                                       //dwExStyle, 扩展样式

                   clsName,                                                 //lpClassName, 窗口类名

                   L"我的应用程序",                                //lpWindowName, 窗口显示的标题

                   WS_OVERLAPPEDWINDOW,                            //dwStyle, 窗口风格

                   CW_USEDEFAULT,/*200*/                       //X, 初始X坐标

                   CW_USEDEFAULT,/*150*/                       //Y, 初始Y坐标

                   CW_USEDEFAULT,/*800*/                       //nWith, 宽度

                   CW_USEDEFAULT,/*500*/                       //nHeight, 高度

                   NULL,                                                              //hWndParent, 父窗口句柄

                   NULL,                                                              //hMenu, 菜单句柄

                   hInstance,                                                        //hInstance, 实例句柄

                   NULL);                                                             //lParam, 用户数据

 

         if (hWnd == NULL)

         {

                   ::MessageBox(hWnd, TEXT("创建窗口出错!"), TEXT("error"), MB_OK);

                   return -1;

         }

 

 

         //显示与更新窗口

         ShowWindow(hWnd, SW_SHOW);

         UpdateWindow(hWnd);

 

         //消息循环

 

         MSG msg;

         while (GetMessage(&msg, NULL, 0, 0))

         {

                   TranslateMessage(&msg);                  //转化键盘消息

                   DispatchMessage(&msg);                   //将消息发送到相应的窗口函数

         }

 

         return msg.wParam; //GetMessaage 返回FALSE 时程序结束

}

 

 

LRESULT CALLBACK WindowsProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

         TCHAR szText[] = TEXT("最简单的窗口程序!");

         switch (uMsg)

         {

                   case WM_PAINT:

                   {

                            HDC hdc;

                            PAINTSTRUCT ps;

 

                            //使无效的客户区变的有效,并取得设备环境句柄

                            hdc = ::BeginPaint(hWnd, &ps);

                            //显示文字

                            ::TextOut(hdc, 10, 10, szText, _tcslen(szText));

 

                            ::EndPaint(hWnd, &ps);

                            return 0;

                   }

 

        

                   case WM_DESTROY:      //正在销毁窗口

                            //向消息队列发送一个WM_QUIT消息,使GetMessage函数返回0

                            ::PostQuitMessage(0);

                            return 0;

         }

         //不处理的消息交给系统默认处理

         return ::DefWindowProc(hWnd, uMsg, wParam, lParam);


dwStyle:    窗口风格样式

 WS_BORDER             创建有单边框的窗口

  WS_CAPTION            有标题框的窗口,包括WS_BORDER

  WS_CHILD                 创建子窗口,不能和WS_POPUP合用

  WS_DISABLED          创建一个初始禁止的子窗口

 WS_DLGFRAME       带对话框风格的窗口,不带标题栏

  WS_HSCROLL            有水平滚动条

 WS_VSCROLL            有垂直滚动条

 WS_ICONIC               初始化时最小化状态的窗口,与WS_MINIMIZE相同

WS_MAXIMIZE         最大化按钮,不能和WS_EX_CONTESTHELP合用,同时必须指定WS_SYSMENU风格

WS_OVERLAPPED    层叠窗口,有标题,边框.与WS_TILED相同

WS_OVERLAPPEDWINDOW    创建有WS_OVERLAPPED,WS_CAPTION,

                                                        WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXMIZEBOX风格的窗口

WS_POPUP                弹出式窗口,不能与WS_CHILD合用

WS_POPUWINDOW         创建有,WS_BORDER,WS_POPUP,WS_SYSMENU,风格的窗口,

                                               WS_CAPTION与WS_POPUWINDOW同时设定才能使菜单可见

WS_SIZEBOX             可调大小的窗口,与WS_THICKFRAME相同

WS_THICKFRAME    可高大小的窗口,

WS_VISIBLE               初始可见的窗口


消息结构体:

typedef struct tagMSG {

         HWND        hwnd;               //消息要发送的窗口句柄

         UINT        message;            //消息标识,以WM_开头的预定义值

         WPARAM      wParam;        //消息参数1

         LPARAM      lParam;            //消息参数2

         DWORD       time;                 //消息放入队列的时间

         POINT       pt;                        //消息放入队列时鼠标的位置

#ifdef _MAC

         DWORD       lPrivate;  //附加消息,Win32不可用

#endif

} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;


Win32 程序学习笔记_创建窗口的评论 (共 条)

分享到微博请遵守国家法律