Code:
/*===========================================================================*/
/*
Ken Fitlike 2006 - Free to good home
Demonstration of owner drawn button and subclassed static control
*/
/*===========================================================================*/
#include <windows.h>
#include <tchar.h>
#define IDC_STATIC_ICON 100
#define IDC_BUTTON 200
/*===========================================================================*/
LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
int OnCreate(HWND hwnd,CREATESTRUCT *cs);
void OnDrawItem(HWND hwnd,DRAWITEMSTRUCT *ds);
LRESULT CALLBACK CntrlProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
WNDPROC oldproc;
/*===========================================================================*/
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR pStr,int nCmd)
{
HWND hwnd;
MSG msg;
TCHAR classname[]=_T("kenf's_wnd");
WNDCLASSEX wcx={0};
wcx.cbSize =sizeof(wcx);
wcx.style =0;
wcx.lpfnWndProc =WndProc;
wcx.cbClsExtra =0;
wcx.cbWndExtra =0;
wcx.hInstance =hInst;
wcx.hIcon =(HICON)LoadImage(0,IDI_APPLICATION,IMAGE_ICON,0,0,LR_SHARED);
wcx.hCursor =(HCURSOR)LoadImage(0,IDC_ARROW,IMAGE_CURSOR,0,0,LR_SHARED);
wcx.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
wcx.lpszMenuName =0;
wcx.lpszClassName=classname;
wcx.hIconSm =0;
if (RegisterClassEx(&wcx))
{
hwnd=CreateWindowEx(0,classname,
_T("Owner drawn button & subclassed static"),
WS_OVERLAPPEDWINDOW,
GetSystemMetrics(SM_CXSCREEN)/4,
GetSystemMetrics(SM_CYSCREEN)/4,
GetSystemMetrics(SM_CXSCREEN)/2,
GetSystemMetrics(SM_CYSCREEN)/2,
0,0,hInst,0);
if (hwnd)
{
ShowWindow(hwnd,nCmd);
UpdateWindow(hwnd);
while (GetMessage(&msg,0,0,0)>0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
else
{
MessageBox(0,_T("Wnd creation failure"),_T("Error"),MB_OK|MB_ICONERROR);
return 0;
}
}
MessageBox(0,_T("Wnd registration failure"),_T("Error"),MB_OK|MB_ICONERROR);
return 0;
}
/*===========================================================================*/
LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
return OnCreate(hwnd,(CREATESTRUCT*)lParam);
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_DRAWITEM:
OnDrawItem(hwnd,(DRAWITEMSTRUCT*)lParam);
return TRUE;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
}
/*===========================================================================*/
int OnCreate(HWND hwnd,CREATESTRUCT *cs)
{
//subclassed static control
CreateWindowEx(0,_T("BUTTON"),_T("Subclassed static control"),
WS_CHILD|WS_VISIBLE|BS_GROUPBOX,
0,0,200,200,
hwnd,
0,
cs->hInstance,
0);
HWND hCntrl=CreateWindowEx(0,_T("STATIC"),0,
WS_CHILD|WS_VISIBLE|SS_ICON|SS_NOTIFY,
10,80,40,40,
hwnd,
(HMENU)IDC_STATIC_ICON,
cs->hInstance,
0);
SendMessage(hCntrl,STM_SETIMAGE,IMAGE_ICON,(LPARAM)LoadImage(0,
IDI_APPLICATION,
IMAGE_ICON,
0,0,LR_SHARED));
oldproc=(WNDPROC)SetWindowLongPtr(hCntrl,GWLP_WNDPROC,(LONG_PTR)CntrlProc);
//ownerdrawn button
CreateWindowEx(0,_T("BUTTON"),_T("Owner drawn button control"),
WS_CHILD|WS_VISIBLE|BS_GROUPBOX,
204,0,200,200,
hwnd,
0,
cs->hInstance,
0);
CreateWindowEx(0,_T("BUTTON"),0,
WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,
240,80,80,40,
hwnd,
(HMENU)IDC_BUTTON,
cs->hInstance,0);
return 0;
}
/*===========================================================================*/
void OnDrawItem(HWND hwnd,DRAWITEMSTRUCT *ds)
{
//draw the button states
HICON hIcon;
FillRect(ds->hDC,&ds->rcItem,GetSysColorBrush(COLOR_BTNFACE));
if (ds->itemState & ODS_SELECTED)
{
hIcon=(HICON)LoadImage(NULL,IDI_ASTERISK,IMAGE_ICON,0,0,LR_SHARED);
}
else
{
hIcon=(HICON)LoadImage(NULL,IDI_APPLICATION,IMAGE_ICON,0,0,LR_SHARED);
}
DrawIcon(ds->hDC,0,0,hIcon);
}
/*===========================================================================*/
LRESULT CALLBACK CntrlProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case WM_LBUTTONDBLCLK:
case WM_LBUTTONDOWN:
SendMessage(hwnd,STM_SETIMAGE,IMAGE_ICON,
(LPARAM)LoadImage(0,IDI_ASTERISK,IMAGE_ICON,0,0,LR_SHARED));
return CallWindowProc(oldproc,hwnd,uMsg,wParam,lParam);
case WM_LBUTTONUP:
SendMessage(hwnd,STM_SETIMAGE,IMAGE_ICON,
(LPARAM)LoadImage(0,IDI_APPLICATION,IMAGE_ICON,0,0,LR_SHARED));
return CallWindowProc(oldproc,hwnd,uMsg,wParam,lParam);
default:
return CallWindowProc(oldproc,hwnd,uMsg,wParam,lParam);
}
}
/*===========================================================================*/