Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отображение меню. Рисование своего popup меню 
:(
    Опции темы
SeregaLBN
Дата 20.10.2003, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.10.2003
Где: Киев

Репутация: нет
Всего: нет



Есть проблема. Рисую своё popup меню.

В обработчике сообщения WM_MEASUREITEM надо задавать размеры элемента меню.

Из начальных данных у меня есть текст, сопоставленный с этим элементом меню.
Зная размеры области в которую поместится текст, я мог бы задать размеры элемента меню, но для этого мне надо знать каким шрифтом в системе рисуется меню.

Вопрос - как мне узнать системный HFONT для меню?

И второй вопрос.
При отрисовке моего пункта меню вся область для рисования больше чем я задавал. Слева, самой Виндой, отводится ещё область для рисунка "check'a" - рисунок точки, галочки (если данный пункт меню отмечен как ODS_CHECKED). Как мне узнать ширину данной области? А то получается, что текст в отображаемых мною пунктах меню не выровнен по сравнению с пунктами меню отображаемыми самой системой.

Ниже приведён рабочий код
////////////////////////////////////////////////////////////////////////////////
#define UNICODE
#ifdef UNICODE
#pragma comment(linker, "/ENTRY:wWinMainCRTStartup")
#define _UNICODE
#else
#pragma comment(linker, "/ENTRY:WinMainCRTStartup")
#endif // UNICODE

#include <stdio.h>
#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
#include <time.h>

////////////////////////////////////////////////////////////////////////////////
// global variables
////////////////////////////////////////////////////////////////////////////////
HINSTANCE ghInstance;

////////////////////////////////////////////////////////////////////////////////
// My types
////////////////////////////////////////////////////////////////////////////////
struct structMyMenuItemData {
TCHAR caption[64];
POINT sizeMenuItem;
/*
... // прочие мои данные для меню
*/
structMyMenuItemData(TCHAR* szStr)
{
sizeMenuItem.x = sizeMenuItem.y = 0;
if (szStr && (_tcslen(szStr)<64))
_tcscpy(caption, szStr);
}
void SetSize(LONG x, LONG y) {sizeMenuItem.x = x; sizeMenuItem.y = y;}
};

////////////////////////////////////////////////////////////////////////////////
// forward declaration
////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProcTest(HWND, UINT, WPARAM, LPARAM);
void InsertMenuItemData(HMENU, UINT, structMyMenuItemData*);
POINT center(const RECT &rc);

BOOL Cls_OnCreate (HWND, LPCREATESTRUCT); // WM_CREATE
void Cls_OnDestroy (HWND); // WM_DESTROY
void Cls_OnMeasureItem(HWND, MEASUREITEMSTRUCT*); // WM_MEASUREITEM
void Cls_OnDrawItem (HWND, const DRAWITEMSTRUCT*); // WM_DRAWITEM

////////////////////////////////////////////////////////////////////////////////
// IMPLEMENTATION
////////////////////////////////////////////////////////////////////////////////
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpszCmdLine, int nCmdShow)
{
ghInstance = hInstance;

const WNDCLASS wc = {
0, WndProcTest, 0, 0,
hInstance,
LoadIcon (NULL, IDI_APPLICATION),
LoadCursor(NULL, IDC_ARROW),
GetSysColorBrush(COLOR_BTNFACE),
NULL, TEXT("ClassWndProject")
};
RegisterClass(&wc);
const HWND hWnd = CreateWindow( TEXT("ClassWndProject"), TEXT("Menu Draw Test"),
WS_OVERLAPPED | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
100, 100, 500, 300, NULL, (HMENU)0, hInstance, NULL );

ShowWindow(hWnd, nCmdShow);

MSG msg;
while ( GetMessage(&msg, NULL, 0, 0)){
DispatchMessage(&msg);
}
return msg.wParam;
}

////////////////////////////////////////////////////////////////////////////////
// Прцедура обработки сообщений
////////////////////////////////////////////////////////////////////////////////

LRESULT CALLBACK WndProcTest(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
switch(msg){
HANDLE_MSG(hwnd, WM_CREATE , Cls_OnCreate);
HANDLE_MSG(hwnd, WM_DESTROY , Cls_OnDestroy);
HANDLE_MSG(hwnd, WM_MEASUREITEM, Cls_OnMeasureItem);
HANDLE_MSG(hwnd, WM_DRAWITEM , Cls_OnDrawItem);
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}

////////////////////////////////////////////////////////////////////////////////
// Обработчики сообщений
////////////////////////////////////////////////////////////////////////////////

// WM_CREATE
BOOL Cls_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
{
srand((unsigned)time(NULL));

// создаю popup меню
HMENU hMenuPop = CreatePopupMenu();
AppendMenu(hMenuPop, MF_STRING, 0, TEXT("MenuItem №0"));
//AppendMenu(hMenuPop, MF_STRING, 1, TEXT("MenuItem №1\tQWE"));
AppendMenu(hMenuPop, MF_SEPARATOR, 0, NULL);
for (int i=3; i<8; i++) {
TCHAR szStr[16];
_stprintf(szStr, TEXT("MenuItem №%i"), i);
InsertMenuItemData(hMenuPop, i, new structMyMenuItemData(szStr)); // на освобождение памяти забиваю
if (rand() < RAND_MAX/2) CheckMenuItem (hMenuPop, i, MF_CHECKED);
if (rand() < RAND_MAX/2) EnableMenuItem(hMenuPop, i, MF_GRAYED);
}


// создаю главное меню
HMENU hMenu = CreateMenu();
SetMenu(hWnd, hMenu);

// добавляю к главному меню popup меню
MENUITEMINFO menuItemInfo = {
sizeof(MENUITEMINFO), // UINT cbSize;
MIIM_SUBMENU | MIIM_TYPE, // UINT fMask;
MFT_STRING, // UINT fType;
0, // UINT fState;
0, // UINT wID;
hMenuPop, // HMENU hSubMenu;
NULL, // HBITMAP hbmpChecked;
NULL, // HBITMAP hbmpUnchecked;
NULL, // DWORD dwItemData;
TEXT("DrawMenu"), // LPTSTR dwTypeData;
0, // UINT cch;
};
InsertMenuItem(hMenu, 0, TRUE, &menuItemInfo);

// отображаю меню
DrawMenuBar(hWnd);

return TRUE;
}

// WM_DESTROY
void Cls_OnDestroy(HWND){
PostQuitMessage(0);
}

// WM_MEASUREITEM
void Cls_OnMeasureItem(HWND hwnd, MEASUREITEMSTRUCT * mi) {
// задаю размеры пункта меню
((structMyMenuItemData*)mi->itemData)->SetSize(
mi->itemWidth = 80,
mi->itemHeight = 20
);
}

// WM_DRAWITEM
void Cls_OnDrawItem(HWND hwnd, const DRAWITEMSTRUCT * dis) {
if (dis->CtlType != ODT_MENU) // error
return;

// Размеры пункта меню dis->rcItem по ширине больше чем я задавал...
// 1. К моим размерам, слева, добаляется область в которой обтображается
// рисунок "check'a" - рисунок точки, галочки или прочий рисунок.
// Отображатся рисунок должен мной. Проблема в том что я не понимаю
// как верно узнать размер этой области.
// 2. К моим размерам, справа, иногда, добавляется ещё область.
// В этой области, если пункт меню ссылается на др. подменю, отображается
// самой Wind'ой треугольник.

structMyMenuItemData *pMyMenuItemData = (structMyMenuItemData*)dis->itemData;

LONG h = dis->rcItem.bottom - dis->rcItem.top; // высота пункта меню
// rcImg - прямоугольник рисунка "check'a"
// считаю что его размеры равны высоте пункта меню
RECT rcImg = {dis->rcItem.left,
dis->rcItem.top,
dis->rcItem.left+h,
dis->rcItem.bottom};
// rcTxt - прямоугольник в котором будет отображаться текст меню
RECT rcTxt = {dis->rcItem.left+h,
dis->rcItem.top,
dis->rcItem.left+h+pMyMenuItemData->sizeMenuItem.x,
dis->rcItem.bottom};

bool isCheck = !!(dis->itemState & ODS_CHECKED);
bool isSelect = !!(dis->itemState & ODS_SELECTED);
bool isGrayed = !!(dis->itemState & ODS_GRAYED);

// fill menu item
SelectObject(dis->hDC, GetSysColorBrush(isSelect ? COLOR_HIGHLIGHT : COLOR_MENU));
PatBlt(dis->hDC, dis->rcItem.left, dis->rcItem.top, dis->rcItem.right-dis->rcItem.left, dis->rcItem.bottom-dis->rcItem.top, PATCOPY);

// draw image "check"
if (isCheck) {
SelectObject(dis->hDC, GetStockObject(isSelect ? WHITE_BRUSH : BLACK_BRUSH));
SelectObject(dis->hDC, GetStockObject(NULL_PEN));
Ellipse(dis->hDC, center(rcImg).x-4, center(rcImg).y-4, center(rcImg).x+4, center(rcImg).y+4);
}

// draw text
int len = _tcslen(pMyMenuItemData->caption);
SetBkMode(dis->hDC, TRANSPARENT);
if (isGrayed) {
if (isSelect){
SetTextColor(dis->hDC, GetSysColor(COLOR_GRAYTEXT));
DrawText(dis->hDC, pMyMenuItemData->caption, len, &rcTxt, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_EXPANDTABS);
} else {
RECT rcTxt2 = {rcTxt.left+1, rcTxt.top+1, rcTxt.right+1, rcTxt.bottom+1};
SetTextColor(dis->hDC, 0xFFFFFF);
DrawText(dis->hDC, pMyMenuItemData->caption, len, &rcTxt2, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_EXPANDTABS);
SetTextColor(dis->hDC, GetSysColor(COLOR_GRAYTEXT));
DrawText(dis->hDC, pMyMenuItemData->caption, len, &rcTxt , DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_EXPANDTABS);
}
} else {
SetTextColor(dis->hDC, GetSysColor(isSelect ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT));
DrawText(dis->hDC, pMyMenuItemData->caption, len, &rcTxt, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_EXPANDTABS);
}
}

////////////////////////////////////////////////////////////////////////////////
// Прочие функции
////////////////////////////////////////////////////////////////////////////////

void InsertMenuItemData(HMENU hMenu, UINT item_ID, structMyMenuItemData *pMyMenuItemData)
// вставка отрисовываемого мной меню
{
MENUITEMINFO mi = {sizeof(MENUITEMINFO),
MIIM_ID | MIIM_TYPE | MIIM_DATA,
MFT_OWNERDRAW,
0,item_ID,0,0,0,
(ULONG)pMyMenuItemData,
0,0
};
InsertMenuItem(
hMenu,
item_ID,
FALSE,
&mi);
}

POINT center(const RECT &rc) {
POINT result = {
rc.left + (rc.right -rc.left)/2,
rc.top + (rc.bottom-rc.top )/2};
return result;
}

////////////////////////////////////////////////////////////////////////////////

PM MAIL   Вверх
Ars
Дата 20.10.2003, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

Репутация: 2
Всего: 2



Вот тебе пример: wink.gif
Код
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 given font attribute and returns the handle of 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. Windows 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.

LRESULT APIENTRY MainWndProc(hwnd, uMsg, wParam, lParam)  
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 of 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;  // points to item of data            
   LPDRAWITEMSTRUCT lpdis;     // points to item drawing data        
   HDC hdc;                    // handle of screen DC                

   SIZE size;                  // menu-item text extents            
   DWORD dwCheckXY;            // check-mark dimensions              
   WORD wCheckX;               // check-mark width                  
   int nTextX;                 // width of menu item                
   int nTextY;                 // height of menu item                
   int i;                      // loop counter                      
   HFONT hfontOld;             // handle of old font                

   BOOL fSelected = FALSE;     // menu-item selection flag          

   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.

           GetTextExtentPoint32(hdc, pmyitem->psz,
               lstrlen(pmyitem->psz), &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.

           dwCheckXY = GetMenuCheckMarkDimensions();

           wCheckX = LOWORD(dwCheckXY);
           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);
           ExtTextOut(lpdis->hDC, nTextX, nTextY, ETO_OPAQUE,
               &lpdis->rcItem, pmyitem->psz,
               lstrlen(pmyitem->psz), 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(fnFont)
int fnFont;             // font-attribute flag            
{
   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);
}



--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
SeregaLBN
Дата 21.10.2003, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.10.2003
Где: Киев

Репутация: нет
Всего: нет



Спасибо за примерчик.
Но в нём, к сожалению, реализовано по своему, а не так как в Винде:
1. Для меню создаётся свой HFONT, а не текущий системный. Я тоже изначально брал HFONT из GetStockObject(SYSTEM_FONT) или из GetStockObject(DEFAULT_GUI_FONT), но они возвращают HFONT в системе по умолчанию, а не текущий (указанный в теме(схеме) Windows).
2. Отступ текста слева в примере вычисляется как LOWORD(GetMenuCheckMarkDimensions()). Я тожже вычислял изначально это смещение из аналогичной функции GetSystemMetrics(SM_CXMENUCHECK). Но эта ф-ция, как сказано в хелпе, возвращает размеры битмапа check'a, а не само смещение текста.

Т.е. те же вопросы остаются:
1. Как узнать текущий системный HFONT меню.
2. Как узнать смещение текста слева для пункта меню.

Ниже приведена изменнёная ф-ция Cls_OnDrawItem, где о всём вышесказанном можно убедиться:

// WM_DRAWITEM
void Cls_OnDrawItem(HWND hwnd, const DRAWITEMSTRUCT * dis) {
if (dis->CtlType != ODT_MENU) // error
return;

HFONT hFontOld = (HFONT)SelectObject(dis->hDC, (HFONT)GetStockObject(DEFAULT_GUI_FONT));
//HFONT hFontOld = (HFONT)SelectObject(dis->hDC, (HFONT)GetStockObject(SYSTEM_FONT));
//HFONT hFontOld = (HFONT)SelectObject(dis->hDC, (HFONT)GetStockObject(ANSI_FIXED_FONT));

// Размеры пункта меню dis->rcItem по ширине больше чем я задавал...
// 1. К моим размерам, слева, добаляется область в которой обтображается
// рисунок "check'a" - рисунок точки, галочки или прочий рисунок.
// Отображатся рисунок должен мной. Проблема в том что я не понимаю
// как верно узнать размер этой области.
// 2. К моим размерам, справа, иногда, добавляется ещё область.
// В этой области, если пункт меню ссылается на др. подменю, отображается
// самой Wind'ой треугольник.

structMyMenuItemData *pMyMenuItemData = (structMyMenuItemData*)dis->itemData;

//LONG h = dis->rcItem.bottom - dis->rcItem.top; // высота пункта меню
int checkX = GetSystemMetrics(SM_CXMENUCHECK); // Dimensions, in pixels, of the default menu check-mark bitmap

// rcImg - прямоугольник рисунка "check'a"
RECT rcImg = {dis->rcItem.left,
dis->rcItem.top,
dis->rcItem.left+checkX,
dis->rcItem.bottom};
// rcTxt - прямоугольник в котором будет отображаться текст меню
RECT rcTxt = {dis->rcItem.left+checkX,
dis->rcItem.top,
dis->rcItem.left+checkX+pMyMenuItemData->sizeMenuItem.x,
dis->rcItem.bottom};

bool isCheck = !!(dis->itemState & ODS_CHECKED);
bool isSelect = !!(dis->itemState & ODS_SELECTED);
bool isGrayed = !!(dis->itemState & ODS_GRAYED);

// fill menu item
SelectObject(dis->hDC, GetSysColorBrush(isSelect ? COLOR_HIGHLIGHT : COLOR_MENU));
PatBlt(dis->hDC, dis->rcItem.left, dis->rcItem.top, dis->rcItem.right-dis->rcItem.left, dis->rcItem.bottom-dis->rcItem.top, PATCOPY);

// draw image "check"
if (isCheck) {
SelectObject(dis->hDC, GetStockObject(isSelect ? WHITE_BRUSH : BLACK_BRUSH));
SelectObject(dis->hDC, GetStockObject(NULL_PEN));
Ellipse(dis->hDC, center(rcImg).x-4, center(rcImg).y-4, center(rcImg).x+4, center(rcImg).y+4);
}

// draw text
int len = _tcslen(pMyMenuItemData->caption);
SetBkMode(dis->hDC, TRANSPARENT);
if (isGrayed) {
if (isSelect){
SetTextColor(dis->hDC, GetSysColor(COLOR_GRAYTEXT));
DrawText(dis->hDC, pMyMenuItemData->caption, len, &rcTxt, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_EXPANDTABS);
} else {
RECT rcTxt2 = {rcTxt.left+1, rcTxt.top+1, rcTxt.right+1, rcTxt.bottom+1};
SetTextColor(dis->hDC, 0xFFFFFF);
DrawText(dis->hDC, pMyMenuItemData->caption, len, &rcTxt2, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_EXPANDTABS);
SetTextColor(dis->hDC, GetSysColor(COLOR_GRAYTEXT));
DrawText(dis->hDC, pMyMenuItemData->caption, len, &rcTxt , DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_EXPANDTABS);
}
} else {
SetTextColor(dis->hDC, GetSysColor(isSelect ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT));
DrawText(dis->hDC, pMyMenuItemData->caption, len, &rcTxt, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_EXPANDTABS);
}


SelectObject(dis->hDC, hFontOld);
}


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0472 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.