|
-
Jun 26th, 2001, 10:12 PM
#1
Thread Starter
Hyperactive Member
Nothing's happening!
I wrote a program that should change the highlight color of my window's menus.
here is the code:
Code:
//This is a practice program: How to make OWNER_DRAWN menus
//Written by Alexis Georges
//Translated from a VB demo from PSC
#include <windows.h>
HMENU hMenu; //our top-menu
HMENU hPopupMenu1; //pop-up menu attached to the top-menu
//menu ID's
#define ID_FIRST 40001
#define ID_SECOND 40002
#define ID_COLOR1 40003 //blue
#define ID_COLOR2 40004 // green
#define ID_COLOR3 40005 //red
//vars
static char g_szClassName[] = "OD Menus - Practice 1";
static HINSTANCE g_hInst = NULL; //storage for the instance of the program
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam,
LPARAM lParam)
{
LPDRAWITEMSTRUCT di;
LPMEASUREITEMSTRUCT ms;
SIZE sz;
HDC hdc;
switch(Message) {
case WM_CREATE:
{
hMenu = CreateMenu();
hPopupMenu1 = CreatePopupMenu();
AppendMenu(hPopupMenu1, MF_STRING | MF_OWNERDRAW,ID_FIRST, "First");
AppendMenu(hPopupMenu1, MF_STRING | MF_OWNERDRAW,ID_SECOND, "Second");
AppendMenu(hPopupMenu1, MF_STRING | MF_OWNERDRAW,ID_COLOR1, "Color 1");
AppendMenu(hPopupMenu1, MF_STRING | MF_OWNERDRAW,ID_COLOR2, "Color 2");
AppendMenu(hPopupMenu1, MF_STRING | MF_OWNERDRAW,ID_COLOR3, "Color 3");
AppendMenu(hMenu,MF_POPUP,(unsigned int)hPopupMenu1,"Voila");
SetMenu(hwnd, hMenu);
DrawMenuBar(hwnd);
UpdateWindow(hwnd);
}
break;
case WM_DRAWITEM:
{
//catch the passing of the structure
di = (LPDRAWITEMSTRUCT)lParam;
HBRUSH use_brush;
HFONT use_font;
HFONT old_font;
LOGFONT lf;
RECT use_rect;
RECT top_rect;
COLORREF color;
if(di->itemState == ODS_SELECTED)
{
switch(di->itemID)
{
case ID_FIRST:
{
color = RGB(00,00,00);
use_brush = CreateSolidBrush(color);
}
case ID_SECOND:
{
color = RGB(22,00,00);
use_brush = CreateSolidBrush(color);
}
default:
use_brush = CreateSolidBrush(GetSysColor(COLOR_MENU));
}
//fill the region with the created brush
FillRect(di->hDC, &di->rcItem, use_brush);
//we can now delete the brush
if(use_brush)
DeleteObject(use_brush);
}
else
//non-selected text color
use_brush = CreateSolidBrush(GetSysColor(COLOR_MENU));
if(di->itemState == ODS_SELECTED)
{
color = RGB(00,00,00);
switch(di->itemID)
{
case ID_COLOR1:
SetTextColor(di->hDC,color);
case ID_COLOR2:
SetTextColor(di->hDC,color);
case ID_COLOR3:
SetTextColor(di->hDC,color);
}
}
else
SetTextColor(di->hDC,color);
SetBkMode(di->hDC, TRANSPARENT);
use_rect = di->rcItem ; //popup menu
top_rect = di->rcItem ; //top menu
use_rect.left = use_rect.left + 16;
//get the cur. font
old_font = (HFONT)SelectObject(di->hDC, GetStockObject(SYSTEM_FONT));
GetObject(old_font, sizeof(lf), &lf);
lf.lfPitchAndFamily = FF_DONTCARE;
lf.lfWeight = 400;
use_font = CreateFontIndirect(&lf); //create our font;
//select it
SelectObject(di->hDC, use_font);
//set corners of the regions
use_rect.left = use_rect.left + 5;
use_rect.top = use_rect.top + 3;
top_rect.left = top_rect.left + 5;
top_rect.top = top_rect.top + 2;
//now, let's draw the text :)
switch(di->CtlID)
{
case ID_FIRST:
DrawText(di->hDC,"First", 4, &top_rect, DT_LEFT | DT_TOP | DT_SINGLELINE);
case ID_SECOND:
DrawText(di->hDC,"Second", 6, &use_rect, DT_LEFT | DT_TOP | DT_SINGLELINE);
case ID_COLOR1:
DrawText(di->hDC,"Color 1", 7, &use_rect, DT_LEFT | DT_TOP | DT_SINGLELINE);
case ID_COLOR2:
DrawText(di->hDC,"Color 2", 7, &use_rect, DT_LEFT | DT_TOP | DT_SINGLELINE);
case ID_COLOR3:
DrawText(di->hDC,"Color 3", 7, &use_rect, DT_LEFT | DT_TOP | DT_SINGLELINE);
}
SelectObject(di->hDC,old_font);
if(use_font)
DeleteObject(old_font);
}
break;
case WM_MEASUREITEM:
{
//dc of our main window
hdc = GetDC(hwnd);
ms = (LPMEASUREITEMSTRUCT)lParam;
if(ms->CtlType == ODT_MENU)
{
//set initial(or default) values
ms->itemHeight = 20;
ms->itemWidth = 60;
//get size from string
if((ms->itemID == ID_FIRST) || (ms->itemID == ID_SECOND))
{
GetTextExtentPoint32(hdc,"SECOND",lstrlen("SECOND"), &sz);
ms->itemHeight = sz.cy;
ms->itemWidth = sz.cx;
}
else if((ms->itemID == ID_COLOR1) || (ms->itemID == ID_COLOR2) ||
(ms->itemID == ID_COLOR3))
{
GetTextExtentPoint32(hdc, "Color 3",lstrlen("Color 3"), &sz);
ms->itemHeight = sz.cy;
ms->itemWidth = sz.cx;
}
}
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,Message,wParam,lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASSEX WndClass;
HWND hwnd;
MSG msg;
g_hInst = hInstance;
WndClass.cbSize = sizeof(WNDCLASSEX);
WndClass.style = NULL;
WndClass.lpfnWndProc = WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = g_hInst;
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW);
WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = g_szClassName;
WndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&WndClass)) {
MessageBox(0, "Window Registration Failed!","Error",
MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
return 0;
}
//create the main window
hwnd = CreateWindowEx(
WS_BORDER,
g_szClassName,
"OD Menus - Practice 1",
WS_MINIMIZEBOX | WS_SYSMENU,
CW_USEDEFAULT, CW_USEDEFAULT, 320, 135,
NULL, NULL, g_hInst, NULL);
//check for null handle
if(hwnd == NULL) {
MessageBox(0, "Window Creation Failed", "Error",
MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
return 0;
}
ShowWindow(hwnd, nShowCmd);
UpdateWindow(hwnd);
//message loop
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
I was just playing around, so a few things might be useless, but when I compile the program, it says there are noerrors, and no warnings. The problem is that my menus are blank except for the top level menu, under that, there is no text or item, just a blank window droping down. Could someone help me(I can't figure it out 
Thanks in advance
Amon Ra
The Power of Learning.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|