GUI基础知识:消息

1.WINAPIWINDEF.H中定义 #define WINAPI      __stdcallCALLBACK也是

2.Unicode 宽字符wchar_t,一个字符占两个字节即8位。

3.一些带有字符参数的宽字符版一般在WCHAR.H中有声明

4.微软Visual C++包含的TCHAR.H提供了通用名,eg:如果定义了UNICODE标识符,且包含了TCHAR.H,那么TCHAR就是wchar_t;否则TCHAR就是char.所以如果明确使用8位就用CHAR,如果明确使用16位就用WCHAR,如果8位还是16位取决于UNICODE就使用TCHAR

5.val_starval_endval_list的使用详细见MSDN.

6.windows中不可以使用printf,windows程序的进入点是WinMain()

MSG                 消息结构                                    PAINSTRUCT           绘图结构

WNDCLASS           窗口类型结构         RECT                  矩形结构

HINSTANCE       程序本身句柄             HDC                  设备内容句柄

句柄是一个32位整数,代表一个对象

windows消息机制:在传统环境中编写的简单C程序,整个流程都包括在main()函数中,而在windows程序中,WinMain()只做了注册窗口类别,建立窗口,从消息队列中取出消息和发送消息所必须的代码。程序中的所有动作都在消息处理程序中完成,windows程序所做的一切都是响应发送给窗口处理程序的消息。

窗口消息处理程序一般由Window本身呼叫,通过呼叫sendmessage程序能呼叫自己的窗口消息处理函数

eg:

#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,PSTR szCmdLine,int iCmdShow)
{
 static TCHAR szAppName[]=TEXT("HELLO WIN");
 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("this program requires windows NT!"),
   szAppName,MB_ICONERROR);
  return 0;
 }
 hwnd=CreateWindow(szAppName,                     //--------------------------------->CreateWindow()呼叫传回之前,windows内部已经创建好该窗口,

                                                                                    //                                                    即已经配置好一片内存存储该 窗口的信息
     TEXT("the hello program"),
     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;

}

对队列消息的处理如下图:

对非队列消息:操作系统不把消息放入消息队列而是直接给消息处理程序,以后过程相同

*消息处理程序虽然是同步的,但必须是可重入的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值