Проблема с меню
-
15 апреля 2012 г. 10:06
Проблема с учебной программой,цель которой вывести меню,возникают проблемы линковщика в двух функциях и меня смущает в одном месте приведение битмапа к типу LPCSTR
#include
<Windows.h>
#include
<CommCtrl.h>
#define
IDM_Enable_Disable 0
#define
IDM_Exit 1
#define
IDM_About 2
#define
IDM_File 3
#define
IDM_Help 4
#define
IDM_Bitmap 5
WCHAR* Messages[] = {L
"Enable or disable exit",
L
"Exit from the program",
L
"About this program",
L
"File operations",
L
"Help operations",
L
"Menu example",
L
"System Menu"};
LRESULT CALLBACK MenuDemoWndProc(HWND,UINT,WPARAM,LPARAM);
HWND hStatusWindow;
UINT wId;
HMENU hMenu,hFileMenu,hHelpMenu;
HINSTANCE hInst;
int
APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpszCmdParam,
intnCmdShow)
{
HWND hWnd;
WNDCLASS WndClass;
MSG Msg;
hInst = hInstance;
WndClass.style = CS_VREDRAW | CS_HREDRAW;
WndClass.lpfnWndProc = (WNDPROC)MenuDemoWndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = hInstance;
WndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
WndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = L
"MenuExample";
if(!RegisterClass(&WndClass))
{
MessageBox(NULL,L
"Cannot register window's class",L"Error",MB_OK);
return0;
}
hWnd = CreateWindow(L
"MenuExample",L"Programm 2",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,
hInstance,NULL);
if(!hWnd)
{
MessageBox(NULL,L
"Cannot create window",L"Error",MB_OK);
return0;
}
InitCommonControls();
hStatusWindow = CreateStatusWindow((WS_CHILD | WS_VISIBLE),
L
"Menu sample",hWnd,wId);
if(!hStatusWindow)
{
MessageBox(NULL,L
"Cannot create status window",L"Error",MB_OK);
return0;
}
//create menu
AppendMenu((hFileMenu = CreatePopupMenu()),MF_ENABLED | MF_STRING,
IDM_Enable_Disable,L
"&Enable exit");
AppendMenu(hFileMenu,MF_GRAYED | MF_STRING,IDM_Exit,L
"E&xit");
AppendMenu((hHelpMenu = CreatePopupMenu()),MF_DISABLED | MF_STRING,IDM_About,L
"&About");
hMenu = CreateMenu();
AppendMenu(hMenu,MF_ENABLED | MF_POPUP,(UINT)hFileMenu,L
"&File");
AppendMenu(hMenu,MF_ENABLED | MF_POPUP,(UINT)hHelpMenu,L
"&Help");
SetMenu(hWnd,hMenu);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
DrawMenuBar(hWnd);
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
returnMsg.wParam;
}
LRESULT CALLBACK MenuDemoWndProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam)
{
RECT Rect;
staticUINT nFlag = MF_ENABLED;
WCHAR* Content[] = {L
"Enable exit",L"Disable exit"};
staticUINT nIndex = 0;
staticHBITMAP hBitmap;
intnDimension;
switch(Message)
{
caseWM_CREATE:
nDimension = GetSystemMetrics(SM_CYMENU);
hBitmap = (HBITMAP)LoadImage(hInst,L
"C:\\Russian.bmp",IMAGE_BITMAP,
nDimension*2,nDimension,LR_LOADFROMFILE);
AppendMenu(GetMenu(hWnd),MF_BITMAP,IDM_Bitmap,(LPCWSTR)hBitmap);//здесь происходит приведение,о котором я говорил
break;
caseWM_COMMAND:
switch(wParam)
{
caseIDM_Enable_Disable:
EnableMenuItem(hFileMenu,IDM_Exit,MF_BYCOMMAND | nFlag);
nFlag = (nFlag == MF_ENABLED) ? MF_GRAYED : MF_ENABLED;
nIndex = (nIndex == 0) ? 1 : 0;
ModifyMenu(hFileMenu,IDM_Enable_Disable,MF_BYCOMMAND |
MF_STRING,IDM_Enable_Disable,Content[nIndex]);
break;
caseIDM_Exit:
SendMessage(hWnd,WM_CLOSE,NULL,NULL);
break;
}
caseWM_SIZE:
SendMessage(hStatusWindow,WM_SIZE,wParam,lParam);
GetClientRect(hWnd,&Rect);
return0;
caseWM_MENUSELECT:
if( ( (UINT)HIWORD(wParam) == 0xffff) && ( (HMENU)lParam == 0) )
{
SendMessage(hStatusWindow,SB_SETTEXT,(WPARAM)0,(LPARAM)Messages[5]);
return0;
}
if( (UINT)HIWORD(wParam) && MF_SYSMENU )
{
SendMessage(hStatusWindow,SB_SETTEXT,(WPARAM)0,(LPARAM)Messages[6]);
return0;
}
if( (UINT)HIWORD(wParam) && MF_POPUP )
{
SendMessage(hStatusWindow,SB_SETTEXT,(WPARAM)0,
(LPARAM)Messages[3 + LOWORD(wParam)]);
return0;
}
SendMessage(hStatusWindow,SB_SETTEXT,(WPARAM)0,
(LPARAM)Messages[LOWORD(wParam)]);
return0;
caseWM_DESTROY:
DeleteObject(hBitmap);
PostQuitMessage(0);
return0;
}
returnDefWindowProc(hWnd,Message,wParam,lParam);
}
Все ответы
-
16 апреля 2012 г. 11:16
Приведение к LPCSTR - это нормально, особенность WinAPI.
Приведите точные ошибки линковщика, по коду их не видно.
-
16 апреля 2012 г. 12:29
Здравствуйте.
Ошибки линковщика скорее всего связаны с тем, что вы забыли подключить библиотеку Comctl32.lib, в которая нужна для функций InitCommonControls и CreateStatusWindow. Подключите данную либу в свойсвах проекта или через директиву:
#pragma comment(lib,"Comctl32.lib")
Это должно устранить ошибки
Для связи [mail]
- Предложено в качестве ответа ulcerMicrosoft Community Contributor 17 апреля 2012 г. 5:51
- Помечено в качестве ответа Abolmasov DmitryMicrosoft Community Contributor 17 апреля 2012 г. 6:19
- Изменено Abolmasov DmitryMicrosoft Community Contributor 17 апреля 2012 г. 6:19
-
17 апреля 2012 г. 2:18
спасибо,это помогло решить проблему

