1.WINAPI在WINDEF.H中定义 #define WINAPI __stdcall。CALLBACK也是
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_star、val_end、val_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;
}
对队列消息的处理如下图:
对非队列消息:操作系统不把消息放入消息队列而是直接给消息处理程序,以后过程相同
*消息处理程序虽然是同步的,但必须是可重入的。