Napríklad v tejto téme používa vlastník ťahané ponuka položky v menu. Položky menu vyberte špecifické atribúty a aplikácia zobrazí každá položka ponuky pomocou písmo, ktoré obsahuje zodpovedajúci atribút. Napríklad položka kurzíva ponuky zobrazená kurzíva písma. Znak názov ponuky na paneli s ponukami otvorí ponuku.
Panel s ponukami a kvapka-down menu sú definované pôvodne rozšírenej ponuke šablóny zdrojov. Pretože ponuka šablónu nie je možné zadať vlastník ťahané položiek, v ponuke pôvodne obsahuje štyri textové položky menu pomocou nasledujúce reťazce: "Pravidelné", "Bold," "Kurzíva" a "Podčiarknuté". " Okno podávaní zmení ich vlastník ťahané položky procesov WM_CREATE správy. Keď obdrží správu WM_CREATE okno postup vyžaduje definovanom aplikáciou OnCreate funkciu, ktorá vykonáva tieto kroky pre každú položku ponuky
Pretože smerník na štruktúru každého definovanom aplikáciou MYITEM uložený ako položka údajov, je odovzdané okno postup v spojení s WM_MEASUREITEM a WM_DRAWITEM správy, aby sa zodpovedajúca položka ponuky. Ukazovateľ je obsiahnutá v členských štátoch itemData MEASUREITEMSTRUCT a DRAWITEMSTRUCT štruktúr.
WM_MEASUREITEM správa sa odošle pre každú položku vlastník ťahané ponuku prvýkrát je zobrazený. Aplikácia procesov túto správu výber písma pre položku ponuky do kontextu zariadenia a potom stanovením priestor vyžaduje zobraziť text položky ponuky v tomto type písma. Text položku Písmo a ponuke aj špecifikované položka ponuky MYITEM štruktúra (štruktúra definovaná v žiadosti). Uplatňovanie určuje veľkosť textu pomocou GetTextExtentPoint32 funkcia.
Okno postup procesy WM_DRAWITEM správy zobrazením text položky ponuky v príslušných typoch písiem. Text položku Písmo a ponuke aj špecifikované položka ponuky MYITEM štruktúra. Uplatňovanie výber farby textu a pozadia primeranú položka ponuky.
Okno postup procesy WM_DESTROY správy zničiť písma a Voľná pamäť. Odstráni písmo a uvoľní definovanom aplikáciou MYITEM štruktúry pre každú položku ponuky.
Nasledujú príslušných častí aplikácie hlavička súboru.
/ / Položka ponuky identifikátory pre menu znak # define IDM_CHARACTER 10 # define IDM_REGULAR 11 # define IDM_BOLD 12 # define IDM_ITALIC 13 # define IDM_UNDERLINE 14 / / štruktúry priradený k ponuke položky typedef struct tagMYITEM {HFONT hfont;
int cchItemText;
znak-szItemText [1];
} MYITEM;
# define CCH_MAXITEMTEXT 256
Nižšie sú uvedené príslušné časti okna podávaní a jej súvisiacich funkcií.
LRESULT CALLBACK MainWindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_CREATE:
if (!OnCreate(hwnd))
return -1;
break;
case WM_DESTROY:
OnDestroy(hwnd);
PostQuitMessage(0);
break;
case WM_MEASUREITEM:
OnMeasureItem(hwnd, (LPMEASUREITEMSTRUCT) lParam);
return TRUE;
case WM_DRAWITEM:
OnDrawItem(hwnd, (LPDRAWITEMSTRUCT) lParam);
return TRUE;
// Additional message processing goes here.
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
BOOL WINAPI OnCreate(HWND hwnd)
{
HMENU hmenuBar = GetMenu(hwnd);
HMENU hmenuPopup;
MENUITEMINFO mii;
UINT uID;
MYITEM *pMyItem;
// Get the handle to the pop-up menu.
mii.fMask = MIIM_SUBMENU; // information to get
GetMenuItemInfo(hmenuBar, IDM_CHARACTER, FALSE, &mii);
hmenuPopup = mii.hSubMenu;
// Modify each menu item. Assume that the IDs IDM_REGULAR
// through IDM_UNDERLINE are consecutive numbers.
for (uID = IDM_REGULAR; uID <= IDM_UNDERLINE; uID++)
{
// Allocate an item structure, leaving space for a
// string of up to CCH_MAXITEMTEXT characters.
pMyItem = (MYITEM *) LocalAlloc(LMEM_FIXED,
sizeof(MYITEM) + CCH_MAXITEMTEXT);
// Save the item text in the item structure.
mii.fMask = MIIM_TYPE;
mii.dwTypeData = pMyItem->szItemText;
mii.cch = CCH_MAXITEMTEXT;
GetMenuItemInfo(hmenuPopup, uID, FALSE, &mii);
pMyItem->cchItemText = mii.cch;
// Reallocate the structure to the minimum required size.
pMyItem = (MYITEM *) LocalReAlloc(pMyItem,
sizeof(MYITEM) + mii.cch, LMEM_MOVEABLE);
// Create the font used to draw the item.
pMyItem->hfont = CreateMenuItemFont(uID);
// Change the item to an owner-drawn item, and save
// the address of the item structure as item data.
mii.fMask = MIIM_TYPE | MIIM_DATA;
mii.fType = MFT_OWNERDRAW;
mii.dwItemData = (DWORD) pMyItem;
SetMenuItemInfo(hmenuPopup, uID, FALSE, &mii);
}
return TRUE;
}
HFONT CreateMenuItemFont(UINT uID)
{
LOGFONT lf;
ZeroMemory(&lf, sizeof(lf));
lf.lfHeight = 20;
lstrcpy(lf.lfFaceName, "Times New Roman");
switch (uID)
{
case IDM_BOLD:
lf.lfWeight = FW_HEAVY;
break;
case IDM_ITALIC:
lf.lfItalic = TRUE;
break;
case IDM_UNDERLINE:
lf.lfUnderline = TRUE;
break;
}
return CreateFontIndirect(&lf);
}
VOID WINAPI OnDestroy(HWND hwnd)
{
HMENU hmenuBar = GetMenu(hwnd);
HMENU hmenuPopup;
MENUITEMINFO mii;
UINT uID;
MYITEM *pMyItem;
// Get the handle to the menu.
mii.fMask = MIIM_SUBMENU; // information to get
GetMenuItemInfo(hmenuBar, IDM_CHARACTER, FALSE, &mii);
hmenuPopup = mii.hSubMenu;
// Free resources associated with each menu item.
for (uID = IDM_REGULAR; uID <= IDM_UNDERLINE; uID++)
{
// Get the item data.
mii.fMask = MIIM_DATA;
GetMenuItemInfo(hmenuPopup, uID, FALSE, &mii);
pMyItem = (MYITEM *) mii.dwItemData;
// Destroy the font and free the item structure.
DeleteObject(pMyItem->hfont);
LocalFree(pMyItem);
}
}
VOID WINAPI OnMeasureItem(HWND hwnd, LPMEASUREITEMSTRUCT lpmis)
{
MYITEM *pMyItem = (MYITEM *) lpmis->itemData;
HDC hdc = GetDC(hwnd);
HFONT hfntOld = SelectObject(hdc, pMyItem->hfont);
SIZE size;
GetTextExtentPoint32(hdc, pMyItem->szItemText,
pMyItem->cchItemText, &size);
lpmis->itemWidth = size.cx;
lpmis->itemHeight = size.cy;
SelectObject(hdc, hfntOld);
ReleaseDC(hwnd, hdc);
}
VOID WINAPI OnDrawItem(HWND hwnd, LPDRAWITEMSTRUCT lpdis)
{
MYITEM *pMyItem = (MYITEM *) lpdis->itemData;
COLORREF clrPrevText, clrPrevBkgnd;
HFONT hfntPrev;
int x, y;
// Set the appropriate foreground and background colors.
if (lpdis->itemState & ODS_SELECTED)
{
clrPrevText = SetTextColor(lpdis->hDC,
GetSysColor(COLOR_HIGHLIGHTTEXT));
clrPrevBkgnd = SetBkColor(lpdis->hDC,
GetSysColor(COLOR_HIGHLIGHT));
}
else
{
clrPrevText = SetTextColor(lpdis->hDC,
GetSysColor(COLOR_MENUTEXT));
clrPrevBkgnd = SetBkColor(lpdis->hDC,
GetSysColor(COLOR_MENU));
}
// Determine where to draw and leave space for a check-mark.
x = lpdis->rcItem.left;
y = lpdis->rcItem.top;
x += GetSystemMetrics(SM_CXMENUCHECK);
// Select the font and draw the text.
hfntPrev = SelectObject(lpdis->hDC, pMyItem->hfont);
ExtTextOut(lpdis->hDC, x, y, ETO_OPAQUE,
&lpdis->rcItem, pMyItem->szItemText,
pMyItem->cchItemText, NULL);
// Restore the original font and colors.
SelectObject(lpdis->hDC, hfntPrev);
SetTextColor(lpdis->hDC, clrPrevText);
SetBkColor(lpdis->hDC, clrPrevBkgnd);
}