Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2010, 20:01   #1
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
По умолчанию Вывести на экран сообщение

Здравствуйте. Помогите, пожалуйста, вывести сообщение на экран (функцией DrawText) при нажатии мышкой на элемент меню File (обозначено картинкой)

Код:
#include <windows.h>
#include <commctrl.h>
#pragma comment (lib,"comctl32.lib")

const int IDM_Enable_Disable=0;
const int IDM_Exit=1;
const int IDM_About=2;
//
const int IDP_File=3;
const int IDP_Help=4;
const int IDM_Bitmap=5;

wchar_t* pMessages[]=
{
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 DepartComTechWndProc(HWND,UINT,UINT,LONG);

HWND hStatusWindow;
WORD wId;
HMENU hMenu,hFileMenu,hHelpMenu;
HINSTANCE hInst;

int APIENTRY WinMain(HINSTANCE hInstance, 
					HINSTANCE hPrevInstance,
				LPSTR lpszCmdParam, int nCmdShow)
{

WNDCLASS WndClass; 
HWND hWnd; 
MSG Msg;

hInst=hInstance;
// инициализация имени класса как строки
//char szClassName[]="DepartComTech";

WndClass.style=CS_HREDRAW|CS_VREDRAW;
WndClass.lpfnWndProc=(WNDPROC)DepartComTechWndProc;
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=L"MyMenu";
WndClass.lpszClassName=L"DepartComTech_Menu";

if(!RegisterClass(&WndClass))
{
	MessageBox(NULL,L"Cannot register class",L"Error",MB_OK);
	return 0;
}

hWnd=CreateWindow(L"DepartComTech_Menu",L"Fifth Example",
				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);
	return 0;
}
//
//Вызывается перед использованием библиотеки
//общих элементов управления, к которым относится
//строка состояния
InitCommonControls();
hStatusWindow=CreateStatusWindow(WS_CHILD|WS_VISIBLE,NULL,hWnd,wId);

if(!hStatusWindow)

{
	MessageBox(NULL,L"Cannot create status window",
		L"Error",MB_OK);
	return 0;
}

//создание меню
//
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();

//вместо элемента меню "File" используется изображение
HANDLE hFile=LoadImage(NULL,L"setup.bmp",IMAGE_BITMAP,20,20,LR_LOADFROMFILE);
AppendMenu(hMenu,MF_ENABLED|MF_POPUP|MF_BITMAP,(UINT)hFileMenu,
			(wchar_t*)hFile);

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);
}
return Msg.wParam;
}

LRESULT CALLBACK DepartComTechWndProc(HWND hWnd,
				UINT Message, UINT wParam,LONG lParam)

{
RECT Rect;
static UINT nFlag=MF_ENABLED;

wchar_t* pContent[]=
{
L"Enable exit",
L"Disable exit"

};
static UINT nIndex=0;

static HBITMAP hBitmap;
int nDimension;

switch(Message)
{
case WM_CREATE:
	nDimension=GetSystemMetrics(SM_CYMENUCHECK);
	hBitmap=HBITMAP(LoadImage(hInst,L"setup.bmp", IMAGE_BITMAP,nDimension*2,nDimension,LR_LOADFROMFILE));
	AppendMenu(GetMenu(hWnd),MF_BITMAP,IDM_Bitmap,LPCWSTR (hBitmap));
	break;

case WM_COMMAND:
	switch(wParam)
	{
	case IDM_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,
			pContent[nIndex]);
	
                   
//
	case IDM_Exit:
		SendMessage(hWnd,WM_CLOSE,NULL,NULL);
	break;

		
	}
case WM_SIZE:
	SendMessage(hStatusWindow,WM_SIZE,wParam,lParam);
	GetClientRect(hWnd,&Rect);
	return 0;
//
case WM_MENUSELECT:
	if(((UINT)HIWORD(wParam)==0xffff)&
		((HMENU)lParam==0))
	{
	SendMessage(hStatusWindow,SB_SETTEXT,(WPARAM) 0,
		(LPARAM) pMessages[5]);
	return 0;
	}
	if((UINT)HIWORD(wParam)& MF_SYSMENU)
	{
	SendMessage(hStatusWindow,SB_SETTEXT,(WPARAM) 0,
		(LPARAM) pMessages[6]);
	return 0;
	}
	if((UINT)HIWORD(wParam)& MF_POPUP)
	{
	SendMessage(hStatusWindow,SB_SETTEXT,(WPARAM) 0,
		(LPARAM) pMessages[3+LOWORD(wParam)]);
	return 0;
	}
	SendMessage(hStatusWindow,SB_SETTEXT,(WPARAM) 0,
		(LPARAM) pMessages[LOWORD(wParam)]);
	return 0;
case WM_DESTROY:
	DeleteObject(hBitmap);
	PostQuitMessage(0);
	return 0;
}                                                                                                        
return DefWindowProc(hWnd,Message,wParam,lParam);
}
JeyKip вне форума Ответить с цитированием
Старый 02.04.2010, 21:10   #2
m_kostik
Пользователь
 
Регистрация: 22.02.2010
Сообщений: 24
По умолчанию

Во-первых, нужно отловить само событие щелчка мышью по меню File, не спутав его ни с чем другим.
Во-вторых нужно прорисовать текст на главном окне.
Пункт 1 выполняется отлавливанием сообщения WM_MENUSELECT. При получении этого сообщения оконная функция в параметре lParam получает хендл соответствующего ПУНКТА меню (в нашем случае пунктом меню будет меню File с хендлом hMenu), в старшем слове wParam флаги (нужно отловить установленный флаг MF_MOUSESELECT, свидетельствующий о выборе меню именно мышью), ав младшем слове wParam - индекс выбранного пункта меню (в нашем случае 0 - меню файл является нулевым пунктот главного меню программы). Далее, заводим статическую переменную BOOL IfFileMenu, которая будет хранить факт нужного события (меню File выбрано мышью). При наступлении события устанавливаем его в TRUE, при другом действии, вызвавшем посылку WM_MENUSELECT - в FALSE:
Код:
case WM_MENUSELECT:
      if(((HMENU)lParam == hMenu) && (LOWORD(wParam) == 0) && (HIWORD(wParam) & MF_MOUSESELECT))
      {
        IfFileMenu = TRUE;
        InvalidateRect(hWnd, NULL, TRUE);
      }
      else
      {
        IfFileMenu = FALSE;
        InvalidateRect(hWnd, NULL, TRUE);
      }
Пункт 2. После наступления события заставляем окно перерисоваться вызовом InvalidateRect(). При этом главное окно получает сообщение WM_PAINT и перерисовывается (нужно добавить переменные HDC hDC, RECT rect и PAINTSTRUCT ps и обработку WM_PAINT):
Код:
case WM_PAINT:
  if(IfFileMenu == TRUE)
  {
    hDC = BeginPaint(hWnd, &ps);
    GetClientRect(hWnd, &rect);
    //выводим надпись
    DrawText(hDC, L"Menu FILE", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    EndPaint(hWnd, &ps);
  }
  else
  {
    hDC = BeginPaint(hWnd, &ps);
    GetClientRect(hWnd, &rect);
    //стираем надпись
    FillRect(hDC, &rect, WHITE_BRUSH);
    EndPaint(hWnd, &ps);
  }
  break;
m_kostik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вывести на экран \n в С++ nicklan Общие вопросы C/C++ 4 30.03.2010 17:02
во время выполнения макроса вывести сообщение о загрузке данных mars56 Microsoft Office Excel 9 18.03.2010 17:27
Вывести строку на экран Dasharnb777 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 13.02.2010 18:59
Как мне из моего класса вывести сообщение? Utkin Общие вопросы Delphi 9 19.11.2009 14:43
Как вывести сообщение... Busine2009 Microsoft Office Word 3 09.06.2009 22:08