As promised. Built with gcc 4.7.2 under Windows7. Hah! the code's two years old next week - oh what I've learned since then. :laugh:
main.cpp
#define WIN32_LEAN_AND_MEAN
#define UNICODE 1
#include <windows.h>
#include <commctrl.h>
#include "resource.h"
HINSTANCE hInst;
#define XBITMAP 48
#define YBITMAP 48
#define BUFFER MAX_PATH
HBITMAP hbmpPencil, hbmpCrayon, hbmpMarker, hbmpPen, hbmpFork;
HBITMAP hbmpPicture, hbmpOld;
void AddItem(HWND hwnd, PTSTR pstr, HBITMAP hbmp)
{
int lbItem;
lbItem = SendMessage(hwnd, LB_ADDSTRING, 0, (LPARAM)pstr);
SendMessage(hwnd, LB_SETITEMDATA, (WPARAM)lbItem, (LPARAM)hbmp);
}
void AddComboItem(HWND hwnd, PTSTR pstr, HBITMAP hbmp)
{
int lbItem;
lbItem = SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)pstr);
SendMessage(hwnd, CB_SETITEMDATA, (WPARAM)lbItem, (LPARAM)hbmp);
}
INT_PTR CALLBACK DlgDrawProc(HWND hDlg, UINT message,
UINT wParam, LONG lParam)
{
HWND hListBox;
PMEASUREITEMSTRUCT pmis;
PDRAWITEMSTRUCT pdis;
HDC hdcMem;
HBITMAP hbmp;
TCHAR achBuffer[BUFFER];
size_t cch;
int yPos;
int lbItem;
TEXTMETRIC tm;
RECT rcBitmap;
HRESULT hr;
switch (message)
{
case WM_INITDIALOG:
hbmpPencil = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_PENCIL));
hbmpCrayon = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_CRAYON));
hbmpMarker = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_MARKER));
hbmpPen = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_PEN));
hbmpFork = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_FORK));
HWND hCombo;
hCombo = GetDlgItem(hDlg, IDC_COMBO1);
AddComboItem(hCombo, L"pencil", hbmpPencil);
AddComboItem(hCombo, L"crayon", hbmpCrayon);
AddComboItem(hCombo, L"marker", hbmpMarker);
AddComboItem(hCombo, L"pen", hbmpPen);
AddComboItem(hCombo, L"fork", hbmpFork);
return TRUE;
case WM_MEASUREITEM:
pmis = (PMEASUREITEMSTRUCT) lParam;
pmis->itemHeight = YBITMAP;
return TRUE;
case WM_DRAWITEM:
pdis = (PDRAWITEMSTRUCT) lParam;
if (pdis->itemID == -1)
{
break;
}
switch (pdis->itemAction)
{
case ODA_SELECT:
case ODA_DRAWENTIRE:
hbmpPicture = (HBITMAP)SendMessage(pdis->hwndItem,
CB_GETITEMDATA, pdis->itemID, 0);
hdcMem = CreateCompatibleDC(pdis->hDC);
hbmpOld = (HBITMAP) SelectObject(hdcMem, hbmpPicture);
BitBlt(pdis->hDC,
pdis->rcItem.left, pdis->rcItem.top,
pdis->rcItem.right - pdis->rcItem.left,
pdis->rcItem.bottom - pdis->rcItem.top,
hdcMem, 0, 0, SRCCOPY);
SendMessage(pdis->hwndItem, CB_GETLBTEXT,
pdis->itemID, (LPARAM)achBuffer);
GetTextMetrics(pdis->hDC, &tm);
yPos = (pdis->rcItem.bottom + pdis->rcItem.top -
tm.tmHeight) / 2;
{
cch = wcslen(achBuffer);
}
TextOut(pdis->hDC, XBITMAP + 6, yPos, achBuffer, cch);
SelectObject(hdcMem, hbmpOld);
DeleteDC(hdcMem);
if (pdis->itemState & ODS_SELECTED)
{
rcBitmap.left = pdis->rcItem.left;
rcBitmap.top = pdis->rcItem.top;
rcBitmap.right = pdis->rcItem.left + XBITMAP;
rcBitmap.bottom = pdis->rcItem.top + YBITMAP;
DrawFocusRect(pdis->hDC, &rcBitmap);
}
break;
case ODA_FOCUS:
break;
}
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_BTN_TEST:
lbItem = SendMessage(GetDlgItem(hDlg, IDC_COMBO1),
CB_GETCURSEL, 0, 0);
hbmp = (HBITMAP) SendMessage(GetDlgItem(hDlg, IDC_COMBO1),
CB_GETITEMDATA, lbItem, 0);
if (hbmp != hbmpFork)
{
MessageBox(hDlg, L"Try again!", L"Oops", MB_OK);
return FALSE;
}
else
{
MessageBox(hDlg, L"You're right!", L"Congratulations.", MB_OK);
}
case IDCANCEL:
EndDialog(hDlg, TRUE);
return TRUE;
default:
return FALSE;
}
case WM_DESTROY:
DeleteObject(hbmpPencil);
DeleteObject(hbmpCrayon);
DeleteObject(hbmpMarker);
DeleteObject(hbmpPen);
DeleteObject(hbmpFork);
return TRUE;
default:
return FALSE;
}
return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
hInst = hInstance;
InitCommonControls();
return DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DlgDrawProc);
}
resource.rc
#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDB_CRAYON BITMAP "bitmap2.bmp"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDB_FORK BITMAP "bitmap5.bmp"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDB_MARKER BITMAP "bitmap3.bmp"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDB_PEN BITMAP "bitmap4.bmp"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDB_PENCIL BITMAP "bitmap1.bmp"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
DLG_MAIN DIALOGEX 6, 5, 194, 84
STYLE DS_3DLOOK | DS_CENTER | DS_SETFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_THICKFRAME | WS_SYSMENU
CAPTION "Code::Blocks Template Dialog App"
FONT 8, "Tahoma", 0, 0, 1
{
PUSHBUTTON "&Test", IDC_BTN_TEST, 67, 62, 46, 15
PUSHBUTTON "&Quit", IDC_BTN_QUIT, 141, 62, 46, 15
COMBOBOX IDC_COMBO1, 7, 7, 180, 30, CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_OWNERDRAWFIXED
}
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
1 RT_MANIFEST ".\\manifest.xml"
resource.h
#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif
#define DLG_MAIN 101
#define IDB_PENCIL 103
#define IDB_CRAYON 105
#define IDB_MARKER 107
#define IDB_PEN 109
#define IDB_FORK 111
#define IDC_COMBO1 1000
#define IDC_BTN_TEST 1001
#define IDC_BTN_QUIT 1002
manifest.xml
="1.0"="UTF-8"="yes"
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>