Click here to Skip to main content
15,907,913 members
Home / Discussions / C / C++ / MFC
   

C / C++ / MFC

 
GeneralRe: stack trace in exception Pin
Stephen Hewitt8-Jul-08 21:33
Stephen Hewitt8-Jul-08 21:33 
GeneralRe: stack trace in exception Pin
George_George8-Jul-08 21:44
George_George8-Jul-08 21:44 
GeneralRe: stack trace in exception Pin
Stephen Hewitt8-Jul-08 21:47
Stephen Hewitt8-Jul-08 21:47 
GeneralRe: stack trace in exception Pin
George_George8-Jul-08 21:59
George_George8-Jul-08 21:59 
GeneralRe: stack trace in exception Pin
Stephen Hewitt8-Jul-08 22:01
Stephen Hewitt8-Jul-08 22:01 
GeneralRe: stack trace in exception Pin
George_George8-Jul-08 22:09
George_George8-Jul-08 22:09 
Questionhow to change menu font? Pin
tataxin8-Jul-08 16:30
tataxin8-Jul-08 16:30 
AnswerRe: how to change menu font? Pin
halibobo8-Jul-08 17:00
halibobo8-Jul-08 17:00 
Setting Fonts for Menu-Item Text Strings
This topic contains an example from an application that uses owner-drawn menu items in a menu. The menu contains items that set the attributes of the current font, and the items are displayed using the appropriate font attribute.

Here is how the menu is defined in the resource-definition file. Note that the strings for the Regular, Bold, Italic, and Underline menu items are assigned at run time, so their strings are empty in the resource-definition file.

MainMenu MENU
BEGIN
POPUP "&Character"
BEGIN
MENUITEM "", IDM_REGULAR
MENUITEM SEPARATOR
MENUITEM "", IDM_BOLD
MENUITEM "", IDM_ITALIC
MENUITEM "", IDM_ULINE
END
END
The application's window procedure processes the messages involved in using owner-drawn menu items. The application uses the WM_CREATE message to do the following:

Set the MF_OWNERDRAW flag for the menu items.
Set the text strings for the menu items.
Obtain handles of the fonts used to draw the items.
Obtain the text and background color values for selected menu items.
The text strings and font handles are stored in an array of application-defined MYITEM structures. The application-defined GetAFont function creates a font that corresponds to the specified font attribute and returns a handle to the font. The handles are destroyed during the processing of the WM_DESTROY message.

During the processing of the WM_MEASUREITEM message, the example gets the width and height of a menu-item string and copies these values into the MEASUREITEMSTRUCT structure. The system uses the width and height values to calculate the size of the menu.

During the processing of the WM_DRAWITEM message, the menu item's string is drawn with room left next to the string for the check-mark bitmap. If the user selects the item, the selected text and background colors are used to draw the item.
Top





LRESULT APIENTRY MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{

typedef struct _MYITEM
{
HFONT hfont;
LPSTR psz;
} MYITEM; // structure for item font and string

MYITEM *pmyitem; // pointer to item's font and string
static MYITEM myitem[CITEMS]; // array of MYITEMS
static HMENU hmenu; // handle to main menu
static COLORREF crSelText; // text color of selected item
static COLORREF crSelBkgnd; // background color of selected item
COLORREF crText; // text color of unselected item
COLORREF crBkgnd; // background color unselected item
LPMEASUREITEMSTRUCT lpmis; // pointer to item of data
LPDRAWITEMSTRUCT lpdis; // pointer to item drawing data
HDC hdc; // handle to screen DC
SIZE size; // menu-item text extents
WORD wCheckX; // check-mark width
int nTextX; // width of menu item
int nTextY; // height of menu item
int i; // loop counter
HFONT hfontOld; // handle to old font
BOOL fSelected = FALSE; // menu-item selection flag
size_t * pcch;
HRESULT hResult;

switch (uMsg)
{
case WM_CREATE:

// Modify the Regular, Bold, Italic, and Underline
// menu items to make them owner-drawn items. Associate
// a MYITEM structure with each item to contain the
// string and font handle for each item.

hmenu = GetMenu(hwnd);
ModifyMenu(hmenu, IDM_REGULAR, MF_BYCOMMAND |
MF_CHECKED | MF_OWNERDRAW, IDM_REGULAR,
(LPTSTR) &myitem[REGULAR]);
ModifyMenu(hmenu, IDM_BOLD, MF_BYCOMMAND |
MF_OWNERDRAW, IDM_BOLD, (LPTSTR) &myitem[BOLD]);
ModifyMenu(hmenu, IDM_ITALIC, MF_BYCOMMAND |
MF_OWNERDRAW, IDM_ITALIC,
(LPTSTR) &myitem[ITALIC]);
ModifyMenu(hmenu, IDM_ULINE, MF_BYCOMMAND |
MF_OWNERDRAW, IDM_ULINE, (LPTSTR) &myitem[ULINE]);

// Retrieve each item's font handle and copy it into
// the hfont member of each item's MYITEM structure.
// Also, copy each item's string into the structures.

myitem[REGULAR].hfont = GetAFont(REGULAR);
myitem[REGULAR].psz = "Regular";
myitem[BOLD].hfont = GetAFont(BOLD);
myitem[BOLD].psz = "Bold";
myitem[ITALIC].hfont = GetAFont(ITALIC);
myitem[ITALIC].psz = "Italic";
myitem[ULINE].hfont = GetAFont(ULINE);
myitem[ULINE].psz = "Underline";

// Retrieve the text and background colors of the
// selected menu text.

crSelText = GetSysColor(COLOR_HIGHLIGHTTEXT);
crSelBkgnd = GetSysColor(COLOR_HIGHLIGHT);

return 0;

case WM_MEASUREITEM:

// Retrieve a device context for the main window.

hdc = GetDC(hwnd);

// Retrieve pointers to the menu item's
// MEASUREITEMSTRUCT structure and MYITEM structure.

lpmis = (LPMEASUREITEMSTRUCT) lParam;
pmyitem = (MYITEM *) lpmis->itemData;

// Select the font associated with the item into
// the main window's device context.

hfontOld = SelectObject(hdc, pmyitem->hfont);

// Retrieve the width and height of the item's string,
// and then copy the width and height into the
// MEASUREITEMSTRUCT structure's itemWidth and
// itemHeight members.

hResult = StringCchLength(pmyitem->psz,STRSAFE_MAX_CCH, pcch);
if (FAILED(hResult))
{
// Add code to fail as securely as possible.
return;
}

GetTextExtentPoint32(hdc, pmyitem->psz,
*pcch, &size);
lpmis->itemWidth = size.cx;
lpmis->itemHeight = size.cy;

// Select the old font back into the device context,
// and then release the device context.

SelectObject(hdc, hfontOld);
ReleaseDC(hwnd, hdc);

return TRUE;

break;

case WM_DRAWITEM:

// Get pointers to the menu item's DRAWITEMSTRUCT
// structure and MYITEM structure.

lpdis = (LPDRAWITEMSTRUCT) lParam;
pmyitem = (MYITEM *) lpdis->itemData;

// If the user has selected the item, use the selected
// text and background colors to display the item.

if (lpdis->itemState & ODS_SELECTED)
{
crText = SetTextColor(lpdis->hDC, crSelText);
crBkgnd = SetBkColor(lpdis->hDC, crSelBkgnd);
fSelected = TRUE;
}

// Remember to leave space in the menu item for the
// check-mark bitmap. Retrieve the width of the bitmap
// and add it to the width of the menu item.

wCheckX = GetSystemMetrics(SM_CXMENUCHECK);
nTextX = wCheckX + lpdis->rcItem.left;
nTextY = lpdis->rcItem.top;

// Select the font associated with the item into the
// item's device context, and then draw the string.

hfontOld = SelectObject(lpdis->hDC, pmyitem->hfont);

hResult = StringCchLength(pmyitem->psz,STRSAFE_MAX_CCH, pcch);
if (FAILED(hResult))
{
// Add code to fail as securely as possible.
return;
}

ExtTextOut(lpdis->hDC, nTextX, nTextY, ETO_OPAQUE,
&lpdis->rcItem, pmyitem->psz,
*pcch, NULL);

// Select the previous font back into the device
// context.

SelectObject(lpdis->hDC, hfontOld);

// Return the text and background colors to their
// normal state (not selected).

if (fSelected)
{
SetTextColor(lpdis->hDC, crText);
SetBkColor(lpdis->hDC, crBkgnd);
}

return TRUE;

// Process other messages.

case WM_DESTROY:

// Destroy the menu items' font handles.

for (i = 0; i < CITEMS; i++)
DeleteObject(myitem[i].hfont);

PostQuitMessage(0);
break;

default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return NULL;
}

HFONT GetAFont(int fnFont)
{
static LOGFONT lf; // structure for font information

// Get a handle to the ANSI fixed-pitch font, and copy
// information about the font to a LOGFONT structure.

GetObject(GetStockObject(ANSI_FIXED_FONT), sizeof(LOGFONT),
&lf);

// Set the font attributes, as appropriate.

if (fnFont == BOLD)
lf.lfWeight = FW_BOLD;
else
lf.lfWeight = FW_NORMAL;

lf.lfItalic = (fnFont == ITALIC);
lf.lfItalic = (fnFont == ULINE);

// Create the font, and then return its handle.

return CreateFont(lf.lfHeight, lf.lfWidth,
lf.lfEscapement, lf.lfOrientation, lf.lfWeight,
lf.lfItalic, lf.lfUnderline, lf.lfStrikeOut, lf.lfCharSet,
lf.lfOutPrecision, lf.lfClipPrecision, lf.lfQuality,
lf.lfPitchAndFamily, lf.lfFaceName);
}
GeneralRe: how to change menu font? Pin
tataxin8-Jul-08 20:30
tataxin8-Jul-08 20:30 
GeneralRe: how to change menu font? Pin
halibobo9-Jul-08 17:32
halibobo9-Jul-08 17:32 
AnswerRe: how to change menu font? Pin
Iain Clarke, Warrior Programmer8-Jul-08 23:56
Iain Clarke, Warrior Programmer8-Jul-08 23:56 
AnswerRe: how to change menu font? Pin
tataxin13-Jul-08 14:26
tataxin13-Jul-08 14:26 
Questiondetecting invalid iterators Pin
bkelly138-Jul-08 15:28
bkelly138-Jul-08 15:28 
AnswerRe: detecting invalid iterators Pin
Stephen Hewitt8-Jul-08 15:44
Stephen Hewitt8-Jul-08 15:44 
Questionali rafiee Pin
fazel dehghani8-Jul-08 8:39
fazel dehghani8-Jul-08 8:39 
AnswerRe: ali rafiee Pin
Stephen Hewitt8-Jul-08 15:15
Stephen Hewitt8-Jul-08 15:15 
QuestionControlling properties during runtime. Pin
Like2Byte8-Jul-08 8:32
Like2Byte8-Jul-08 8:32 
QuestionRe: Controlling properties during runtime. Pin
Mark Salsbery8-Jul-08 8:48
Mark Salsbery8-Jul-08 8:48 
AnswerRe: Controlling properties during runtime. Pin
led mike8-Jul-08 9:02
led mike8-Jul-08 9:02 
GeneralRe: Controlling properties during runtime. Pin
Mark Salsbery8-Jul-08 9:09
Mark Salsbery8-Jul-08 9:09 
GeneralRe: Controlling properties during runtime. Pin
led mike8-Jul-08 9:24
led mike8-Jul-08 9:24 
GeneralRe: Controlling properties during runtime. Pin
Mark Salsbery8-Jul-08 9:28
Mark Salsbery8-Jul-08 9:28 
QuestionFSOUND_Stream_Open library takes so much time to open a .MP3 file Pin
shinewine8-Jul-08 8:29
shinewine8-Jul-08 8:29 
QuestionRe: FSOUND_Stream_Open library takes so much time to open a .MP3 file Pin
Mark Salsbery8-Jul-08 8:51
Mark Salsbery8-Jul-08 8:51 
AnswerRe: FSOUND_Stream_Open library takes so much time to open a .MP3 file Pin
killabyte8-Jul-08 12:38
killabyte8-Jul-08 12:38 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.