创建窗口

消息循环”,实际是程序循环即Windows 中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个消息队列,即应用程序队列,用来存放该程序可能创建的各种窗口的消息。应用程序中含有一段称作消息循环的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数.

消息循环代码是应用程序中主函数WinMain ( )中类似如下的程序段

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

{ //消息队列中取得消息

TranslateMessage(&msg);

//检索并生成字符消息WM_CHAR

DispatchMessage(&msg);

//将消息发送给相应的窗口函数

}

 

创建窗口实例

注册表初始化

typedef struct _WNDCLASS {

    UINT       style; //默认风格,窗口尺寸被修改后重画窗口

    WNDPROC    lpfnWndProc; //窗口回调

    int        cbClsExtra; //窗口类的额外空间

    int        cbWndExtra; //窗口实例的额外空间

    HINSTANCE  hInstance; //句柄实例

    HICON      hIcon; //图标

    HCURSOR    hCursor; //光标

    HBRUSH     hbrBackground; //背景

    LPCTSTR    lpszMenuName; //菜单

    LPCTSTR    lpszClassName; //类名

} WNDCLASS, *PWNDCLASS;

注册窗口类  返回值为0表示失败 成功返回

ATOM nRet = RegisterClass(&wc);

获取错误信息在工具错误列表查看错误报告或者@err.hr *(int*)(tib+0x34).hr

DWORD dwErrCode = GetLastError();

错误信息显示FormatMessage

 LPVOID lpMsgBuf;

  FormatMessage(

    FORMAT_MESSAGE_ALLOCATE_BUFFER |

    FORMAT_MESSAGE_FROM_SYSTEM |

    FORMAT_MESSAGE_IGNORE_INSERTS,

    NULL,

    GetLastError(),

    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language

    (LPTSTR)&lpMsgBuf,

    0,

    NULL

    );

  // Process any inserts in lpMsgBuf.

  // ...

  // Display the string.

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK | MB_ICONINFORMATION);

  // Free the buffer.

  LocalFree(lpMsgBuf);

创建窗口实例

HWND CreateWindow(

 LPCTSTR lpClassName, //窗口类名

LPCTSTR lpWindowName,  //窗口标题

DWORD dwStyle,//窗口属性  一般有ws_overlapped   ws_child    ws_popup

 int x, int y,//窗口坐标

 int nWidth,//窗口宽

 int nHeight,//窗口高

 HWND hWndParent, 父窗口

HMENU hMenu, 菜单

HANDLE hInstance,  //句柄实例

 PVOID lpParam );//保留值 用来传值 一般添NULL

  

显示窗口

  BOOL ShowWindow(

HWND hWnd, // handle to window  窗口句柄

int nCmdShow // show state 显示风格

 );

一般显示窗口完了后就是更新窗口,两个在一块

更新窗口

  UpdateWindow(HWND hWnd);

一般系统将消息投入消息队列,消息队列取出消息分辨窗口句柄,将消息传给回调函数,回调函数分辨消息作用来实现对应的功能

获得消息

BOOL GetMessage(

LPMSG lpMsg,获取的消息指针存入, 比如MSG msg;    &msg

 HWND hWnd,       窗口句柄

UINT wMsgFilterMin,   获取消息最小值

UINT wMsgFilterMax );  获取消息最小值

列子

BOOL bRet;

 

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)

{

    if (bRet == -1)

    {

        // handle the error and possibly exit

    }

    else

    {

        TranslateMessage(&msg);

        DispatchMessage(&msg);

    }

}

 

回调函数(msdn,没找到相关信息 还有待了解)

LRESULT CALLBACK WindowProc(HWND hwnd,      // handle to window

  UINT uMsg,      // message identifier

  WPARAM wParam,  // first message parameter

  LPARAM lParam   // second message parameter

  ){};

一般回调函数其他情况会返回以下内容   为将其他情况交给系统默认处理

 return DefWindowProc(hwnd, uMsg, wParam, lParam);

switch (uMsg)

  {

//如果消息为退出 向消息队列投递退出消息队列信息

  case WM_DESTROY:

    //向消息队列投递WM_QUIT消息

    PostQuitMessage(0);

    return 0;

   // 鼠标消息,左键按下  返回窗口的坐标属性

   case WM_LBUTTONDOWN:

   {

     int xPos = LOWORD(lParam);

     int yPos = HIWORD(lParam);

     return 0;

   }

  default:

    break;

}

posted @ 2020-09-04 14:10  特权E5  阅读(171)  评论(0编辑  收藏  举报