LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { static HWND hwndButton[NUM]; static RECT rect; static TCHAR szTop[]=TEXT("message wParam lParam"), szUnd[]=TEXT("_______ ______ ______"), szFormat[]=TEXT("%-16s%04X-%04X %04X-%04X"), szBuffer[50]; static int cxChar,cyChar; HDC hdc; PAINTSTRUCT ps; int i; switch(message) { case WM_CREATE: //获取系统字体的横纵坐标 cxChar=LOWORD(GetDialogBaseUnits()); cyChar=HIWORD(GetDialogBaseUnits()); for(i=0;i<NUM;i++) hwndButton[i]=CreateWindow(TEXT("button"),button[i].szText,WS_CHILD|WS_VISIBLE|button[i].iStyle, cxChar,cyChar*(1+2*i),20*cxChar,7*cyChar/4,hwnd,(HMENU)i,((LPCREATESTRUCT)lParam)->hInstance,NULL); return 0; case WM_SIZE: //这个矩形是按钮右侧的一块区域 rect.left=24*cxChar; rect.top=2*cyChar; rect.right=LOWORD(lParam); rect.bottom=HIWORD(lParam); return 0; case WM_PAINT: //没发现这一句的用处 //InvalidateRect(hwnd,&rect,TRUE); hdc=BeginPaint(hwnd,&ps); //设置系统字体 SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT)); //设置背景透明 SetBkMode(hdc,TRANSPARENT); //输出标题跟下划线 TextOut(hdc,24*cxChar,cyChar,szTop,lstrlen(szTop)); TextOut(hdc,24*cxChar,cyChar,szUnd,lstrlen(szUnd)); EndPaint(hwnd,&ps); return 0; //当具有自绘风格的按钮、组合框、列表框或者菜单的可见部分发生改变时 case WM_DRAWITEM: //当用户从菜单选中一个命令项目、当一个控件发送通知消息给去父窗口或者按下一个快捷键将发送 case WM_COMMAND: //函数滚动所指定的窗口客户区域内容,-cyChar为向上滚动 ScrollWindow(hwnd,0,-cyChar,&rect,&rect); hdc=GetDC(hwnd); TextOut(hdc,24*cxChar,cyChar*(rect.bottom/cyChar-1),szBuffer,wsprintf(szBuffer,szFormat, message==WM_DRAWITEM?TEXT("WM_DRAWITEM"):TEXT("WM_COMMAND"), HIWORD(wParam),LOWORD(wParam),HIWORD(lParam),LOWORD(lParam))); ReleaseDC(hwnd,hdc); //更新无效区域 ValidateRect(hwnd,&rect); break; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,message,wParam,lParam); }