网上找了很多
,
可只是给出代码
,
没有详细解释
,
不便初学者理解
.
我就抄回冷饭
.
把这个再拿出来说说
.
实例图片
:

首先建立一个标准的
Win32 Application
工程
.
选择
a simple Win32 Application.
然后建立我们的资源文件首先新建一个对话框资源
,
资源
ID
改为
IDD_MAIN_DLG
然后在其上新建一个按钮控件资源
ID
改为
IDC_ODBUTTON,
此按钮的
styles
中必须选中
owenerdraw
属性
.
然后将其保存为
.rc
的资源文件
.
并将其导入我们的工程
.
同理新建一个图标文件资源
ID
改为
IDI_OWNERDRAW
保存为
.ico
的图标然后导入
.
准备工作做完了下面开始写代码
.
首先声明如下全局变量.
#include "stdafx.h"
#include "resource.h"
#include "resource.h"
HINSTANCE odInst = NULL;
//
接收程序实例的句柄
HWND hMainWnd = NULL; // 接收主窗口的句柄
HWND hDlgNow = NULL; // 接收对话框的句柄
static HICON hOwnerDrawIcon = NULL; // 用作自绘按钮的图标
static LONG prev_proc; // 储存按钮先前的回调函数
static HICON hIcon = NULL; // 对话框图标句柄
HWND hMainWnd = NULL; // 接收主窗口的句柄
HWND hDlgNow = NULL; // 接收对话框的句柄
static HICON hOwnerDrawIcon = NULL; // 用作自绘按钮的图标
static LONG prev_proc; // 储存按钮先前的回调函数
static HICON hIcon = NULL; // 对话框图标句柄
然后开始写WinMain()函数
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
...{
// TODO: Place code here.
odInst = hInstance;
WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = (WNDPROC)ODWndProc; // 定义一个窗口默认函数 , 这里我们会交由默认窗口函数处理
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(odInst,MAKEINTRESOURCE(IDI_OWNERDRAW));
wc.hCursor = NULL;
wc.hbrBackground = 0;
wc.lpszClassName = "OwnerDraw";
wc.lpszMenuName = NULL;
RegisterClass(&wc);
MSG msg;
HWND onlywin= FindWindow("OwnerDraw","MyOwnerDraw");
if (onlywin)
... {
ExitProcess(1);
}
hMainWnd=CreateWindow("OwnerDraw","MyOwnerDraw",WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);
if (!hMainWnd)
... {
return FALSE;
}
hDlgNow = DoMainDlg(hMainWnd);
ShowWindow(hDlgNow, nCmdShow);
while (GetMessage(&msg, NULL, 0, 0))
... {
if (NULL == hDlgNow || !IsDialogMessage(hDlgNow, &msg))
... {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
...{
// TODO: Place code here.
odInst = hInstance;
WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = (WNDPROC)ODWndProc; // 定义一个窗口默认函数 , 这里我们会交由默认窗口函数处理
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(odInst,MAKEINTRESOURCE(IDI_OWNERDRAW));
wc.hCursor = NULL;
wc.hbrBackground = 0;
wc.lpszClassName = "OwnerDraw";
wc.lpszMenuName = NULL;
RegisterClass(&wc);
MSG msg;
HWND onlywin= FindWindow("OwnerDraw","MyOwnerDraw");
if (onlywin)
... {
ExitProcess(1);
}
hMainWnd=CreateWindow("OwnerDraw","MyOwnerDraw",WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);
if (!hMainWnd)
... {
return FALSE;
}
hDlgNow = DoMainDlg(hMainWnd);
ShowWindow(hDlgNow, nCmdShow);
while (GetMessage(&msg, NULL, 0, 0))
... {
if (NULL == hDlgNow || !IsDialogMessage(hDlgNow, &msg))
... {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
首先注册一个标准的窗口类
,
的
WNDCLASS
结构体
,
默认的窗口过程为
ODWndProc.
其定义如下
.
LRESULT CALLBACK ODWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
...{
return DefWindowProc(hWnd, message, wParam, lParam);// 返回系统默认的窗口过程
}
...{
return DefWindowProc(hWnd, message, wParam, lParam);// 返回系统默认的窗口过程
}
然后判断有无相同实例存在如有则结束之
HWND onlywin= FindWindow("OwnerDraw","MyOwnerDraw");
if (onlywin)
...{
ExitProcess(1);
}
if (onlywin)
...{
ExitProcess(1);
}
接下来创建主窗口 </