匈牙利表示法
在变量前添加表示变量类型的字母前缀,并继以一个大写字母开头的对变量的简短描述
Item Value sz 指向一个以零字符结尾的字符串中的第一个字符 str 字符串 i int d double by byte l long p pointer lp long pointer n 数或int ui unsigned int c char w WORD(unsigned short) dw DWORD(unsigned long) fn 函数指针 lpstr 指向字符串的long pointer h 句柄 m_ 类成员 g_ 全局类型 hwnd 窗口句柄 | hdc | Windows设备上下文(device context)的句柄 |
第一个窗口
- 需要填充一个
WNDCLASSEX
结构
WNDCLASSEX winclass;
winclass.cbSize = sizeof(WNDCLASSEX);
//这个赋值很重要,在下面create的时候,用
winclass.lpszClassName = g_szWindowClassName;
//...填充过程不写了
//注册window类
if(!RegisterClassEx(&winclass)){
MessageBox(NULL, "Class Registation Failed!", "Error", 0);
return 0;
}
hWnd = CreateWindowEx(NULL,
g_szWindowClassName,//这里和注册联系起来
g_szApplicationName,
WS_OVERLAPPENDWINDOW,
0,0,
WINDOW_WIDTH,
WINDOW_HEIGHT,
NULL,
NULL,
hInstance,//程序的实例句柄,从主函数传来
NULL);
//使窗口可见
ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd);
//在退出程序的时候,撤销注册的类
UnregisterClass(g_szWindowClassName, hInstance);
//---------------------------------------------------------
//-------------消息循环--------------------------------------
MSG msg;
while(GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
bool bDone = false;
MSG msg;
while(!bDone){
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
if(msg.message == WM_QUIT){
bDone = true;
}else{
TranslateMessate(&msg);
DispatchMessage(&msg);
}
}
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
}
//---------------------------------------------------------
//---------------------------------------------------------
//------------绘图-------------------------
case WM_PAINT:{
PAINTSTRUCT ps;
HDC hdc; //设备描述表
//填充ps,返回hdc(= ps.hdc)
hdc = BeginPaint(hwnd, &ps);
//...
EndPaint(hwnd, &ps);//这里自动释放了hdc
return 0;
}
//======================================================
//函数原型
BOOL UnregisterClass(
LPSTSTR lpClassName,//注册时指定的名字
HINSTANCE hInstance
);
//创建窗口,函数原型
HWND CreateWindowEx(DWORD dwExStyle,
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam
);
- 创建双缓冲
/* 创建一个与显示DC兼容的内存设备描述表,使用NULL作为参数的时候
* 默认创建一个与当前屏幕兼容的DC。但当内存设备描述表被创建出来时
* 它是单色的,并且宽度和高度各为一个像素,因此在开始使用时,要创建
* 一张大小和格式与前置缓冲完全一致的位图,并利用selectObject函数
* 将其选入内存DC
*/
HDC hdcBackBuffer = CreateCompatibleDC(NULL);
//创建位图
HDC hdc = GetDC(hwnd);
HBITMAP hBitmap =
CreateCompatibleBitmap(hdc, cxClient, cyClient);
HBITMAP hOldBitmap =
(HBITMAP)SelectObject(hdcBackBuffer, hBitmap);
//释放DC
ReleaseDC(hwnd, hdc);
/* -------使用后备缓冲--------------
* 1.清除后备缓冲--通常采用背景色填充
* 2.在后备缓冲的hdc绘图、写字
* 3.将后备缓冲中的内容复制到前台缓冲
*/
//后备缓冲填充白色
BitBlt(hdcBackBuffer, 0, 0, cxClient, cyClient, NULL, NULL, NULL, WHITENESS);
//绘图...
//将后备缓冲区的内容传送到显示缓冲区
BitBlt(ps.hdc, 0, 0, cxClient, cyClient, hdcBackBuffer, 0, 0, SRCCOPY);
HBITMAP CreateCompatibleBitmap(
HDC hdc, //DC句柄
int nWidth, //
int nHeight
);
//BitBlt函数原型,通常用来将后备缓冲中的所有bit复制到显示内存区
BOOL BitBlt(
HDC hdcDest,
int nXDest,
int nYDest,
int nWidth,
int nHeight,
HDC hdcSrc,
int nXSrc,
int nYSrc,
DWORD dwRop
);