#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK TemplateProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK CreateProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK SelfDrawProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK SubclassProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK BtnProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
HWND hDlgModeless=NULL;//保存全局非模态对话框
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("SDKButton");
HWND hwnd;
MSG msg;
WNDCLASSEX wndclassex = {0};
wndclassex.cbSize = sizeof(WNDCLASSEX);
wndclassex.style = CS_HREDRAW | CS_VREDRAW;
wndclassex.lpfnWndProc = WndProc;
wndclassex.cbClsExtra = 0;
wndclassex.cbWndExtra = 0;
wndclassex.hInstance = hInstance;
wndclassex.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclassex.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclassex.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclassex.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU);
wndclassex.lpszClassName = szAppName;
wndclassex.hIconSm = wndclassex.hIcon;
if (!RegisterClassEx (&wndclassex))
{
MessageBox (NULL, TEXT ("RegisterClassEx failed!"), szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW,
szAppName,
TEXT ("SDK Button测试"),
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))
{
//注意非模态对话框消息由主窗口分发
if (hDlgModeless == NULL || !IsDialogMessage(hDlgModeless, &msg))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
return msg.wParam;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static RECT rect;
TCHAR szDrawText[] = TEXT("欢迎访问我的博客http://blog.csdn.net/wenzhou1219");
switch (message)
{
case WM_SIZE:
GetClientRect(hwnd, &rect);
return (0);
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
DrawText(hdc, szDrawText, -1, &rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
EndPaint (hwnd, &ps);
return (0);
case WM_COMMAND:
//分发菜单
switch (LOWORD(wParam))
{
case IDM_TEMPLATE:
DialogBox(GetWindowLong(hwnd, GWL_HINSTANCE),
IDD_TEMPLATE,
hwnd,
TemplateProc);
break;
case IDM_CREATE:
hDlgModeless = CreateDialog(GetWindowLong(hwnd, GWL_HINSTANCE),
MAKEINTRESOURCE(IDD_CREATE),
hwnd,
CreateProc);
ShowWindow(hDlgModeless, SW_NORMAL);//注意非模态对话框不指明WS_VISIBLE属性必须显示调用ShowWindow来显示
break;
case IDM_SELFDRAW:
DialogBox(GetWindowLong(hwnd, GWL_HINSTANCE),
IDD_SELFDRAW,
hwnd,
SelfDrawProc);
break;
case IDM_SUBCLASS:
DialogBox(GetWindowLong(hwnd, GWL_HINSTANCE),
IDD_SUBCLASS,
hwnd,
SubclassProc);
break;
}
return (0);
case WM_DESTROY:
PostQuitMessage (0);
return (0);
}
return DefWindowProc (hwnd, message, wParam, lParam);
}
BOOL CALLBACK TemplateProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_CLOSE:
{
EndDialog(hDlg,0);
}
return (TRUE);
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDCANCEL:
{
SendMessage(hDlg, WM_CLOSE, 0, 0);
}
return (TRUE);
case IDOK:
{
}
return (TRUE);
}
return (FALSE);
}
return (FALSE);
}
BOOL CALLBACK CreateProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
{
//动态创建控件子窗口
CreateWindow(TEXT("button"),
TEXT("确定"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
10, 10,
100, 50,
hDlg,
(HMENU)IDOK,
GetWindowLong(hDlg, GWL_HINSTANCE),
NULL);
CreateWindow(TEXT("button"),
TEXT("取消"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
10, 100,
100, 50,
hDlg,
(HMENU)IDCANCEL,
GetWindowLong(hDlg, GWL_HINSTANCE),
NULL);
}
return (TRUE);
case WM_CLOSE:
DestroyWindow(hDlg);
hDlgModeless = NULL;//注意及时将指针置0防止窗口销毁后消窗口分发消息
return (TRUE);
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDCANCEL:
{
SendMessage(hDlg, WM_CLOSE, 0, 0);
}
return (TRUE);
case IDOK:
{
}
return (TRUE);
}
return (FALSE);
}
return (FALSE);
}
BOOL CALLBACK SelfDrawProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
LPDRAWITEMSTRUCT pdis;
HDC hdc;
HDC hMemDc;
static HINSTANCE hInstance;
static HBITMAP hBitmapOK_D;
static HBITMAP hBitmapOK_U;
static HBITMAP hBitmapOK_F;
static HBITMAP hBitmapCANCEL_D;
static HBITMAP hBitmapCANCEL_U;
static HBITMAP hBitmapCANCEL_F;
static HWND hwndOk;
static HWND hwndCanel;
static BITMAP bm;
switch(message)
{
case WM_INITDIALOG:
{
hInstance = GetWindowLong(hDlg, GWL_HINSTANCE);
hwndOk = GetDlgItem(hDlg, IDOK);
hwndCanel = GetDlgItem(hDlg, IDCANCEL);
hBitmapOK_D = LoadBitmap(hInstance, TEXT("image1d"));
hBitmapOK_U = LoadBitmap(hInstance, TEXT("image1u"));
hBitmapOK_F = LoadBitmap(hInstance, TEXT("image1f"));
hBitmapCANCEL_D = LoadBitmap(hInstance, TEXT("image2d"));
hBitmapCANCEL_U = LoadBitmap(hInstance, TEXT("image2u"));
hBitmapCANCEL_F = LoadBitmap(hInstance, TEXT("image2f"));
GetObject(hBitmapCANCEL_D, sizeof(BITMAP), (PTSTR)&bm);
//调整按钮大小和最大图片一样大
SetWindowPos(hwndOk, HWND_TOPMOST, 0, 0, bm.bmWidth, bm.bmHeight, SWP_NOZORDER | SWP_NOMOVE);
SetWindowPos(hwndCanel, HWND_TOPMOST, 0, 0, bm.bmWidth, bm.bmHeight, SWP_NOZORDER | SWP_NOMOVE);
}
return (TRUE);
case WM_CLOSE:
{
EndDialog(hDlg,0);
}
return (TRUE);
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDCANCEL:
{
SendMessage(hDlg, WM_CLOSE, 0, 0);
}
return (TRUE);
case IDOK:
{
}
return (TRUE);
}
return (FALSE);
//自绘制按钮
case WM_DRAWITEM:
//获得绘制结构体,包含绘制的按钮DC和当前按钮状态等
pdis = (LPDRAWITEMSTRUCT)lParam;
if (pdis->CtlType == ODT_BUTTON)//只绘制button类型
{
hdc = pdis->hDC;
SaveDC(hdc);//保存DC,绘制完必须恢复默认
//绘制默认状态
hMemDc = CreateCompatibleDC(hdc);
SelectObject(hMemDc, pdis->CtlID == IDOK ? hBitmapOK_U : hBitmapCANCEL_U);
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hMemDc, 0, 0, SRCCOPY);
DeleteDC(hMemDc);
//绘制获取焦点时状态
if (pdis->itemState & ODS_FOCUS)
{
hMemDc = CreateCompatibleDC(hdc);
SelectObject(hMemDc, pdis->CtlID == IDOK ? hBitmapOK_F : hBitmapCANCEL_F);
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hMemDc, 0, 0, SRCCOPY);
DeleteDC(hMemDc);
}
//绘制下压状态
if (pdis->itemState & ODS_SELECTED)
{
hMemDc = CreateCompatibleDC(hdc);
SelectObject(hMemDc, pdis->CtlID == ID
- 1
- 2
- 3
- 4
前往页