//####################### MAIN MENU ##############################//
MYMENU MENU DISCARDABLE
BEGIN
POPUP "&File"
BEGIN
MENUITEM "&EXIT", 101
END
POPUP "&Argument"
BEGIN
MENUITEM "Set &a", 102
MENUITEM "Set &b", 103
END
END
//###################### DIALOG ###################################//
SetDlg DIALOG DISCARDABLE 0, 0, 186, 47
STYLE WS_POPUP | WS_CAPTION | DS_CENTER
CAPTION "Dialog"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK",104,29,26,50,14
PUSHBUTTON "CANCEL",105,92,26,50,14
EDITTEXT 106,7,8,172,14,ES_CENTER | ES_AUTOHSCROLL
END
//#################### ACCELERATORS TABLE ########################//
MyMenu ACCELERATORS
{
"x", 101, ASCII
"a", 102, ASCII
"b", 103, ASCII
}
Accelerators
Посмотрите пожалуста.
Код:
Код:
#include <windows.h>
#include <winuser.h>
#include <math.h>
#include <string.h>
//##################### CONST ####################################//
#define IDM_EXIT 101
#define IDM_SETA 102
#define IDM_SETB 103
//===================== gloval ===================================//
char CName[] = "Primitive" ;
HWND hWnd, hDlg ;
MSG mmsg ;
int a=200, b=10, v,ansver ;
float x,y ;
HINSTANCE t;
char buffer[30];
HACCEL hAccel ;
//===================== proto ====================================//
LRESULT CALLBACK WndProc1(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) ;
BOOL CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
//===================== main
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int )
{
t = hInst ;
//------ register
WNDCLASS wc ;
wc.style = CS_HREDRAW || CS_VREDRAW ;
wc.lpfnWndProc = WndProc1 ;
wc.cbClsExtra = 0 ;
wc.cbWndExtra = 0 ;
wc.hInstance = hInst ;
wc.hIcon = LoadIcon(0, IDI_APPLICATION ) ;
wc.hCursor = LoadCursor(0, IDC_ARROW ) ;
wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH ) ;
wc.lpszMenuName = "MyMenu" ;
wc.lpszClassName = CName ;
RegisterClass(&wc);
//------ create
hWnd = CreateWindow(CName, CName, WS_OVERLAPPEDWINDOW , CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL, NULL, hInst, NULL) ;
if(!hWnd)
{
MessageBox(0, "Can't create window", "Error", 0) ;
return 0 ;
}
//----- Load accelerators
hAccel = LoadAccelerators(hInst, "MyMenu") ;
//------ show
ShowWindow(hWnd, SW_MAXIMIZE) ;
UpdateWindow(hWnd) ;
//------ msg loop
while( GetMessage(&mmsg, NULL, NULL, NULL) )
{
TranslateAccelerator(hWnd, hAccel, &mmsg) ;
TranslateMessage(&mmsg) ;
DispatchMessage(&mmsg) ;
}
return mmsg.wParam ;
}
//========== wnd proc
LRESULT CALLBACK WndProc1(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch(uMsg)
{
//################### WM_PAINT
case WM_PAINT :
HDC hDC ;
PAINTSTRUCT PS ;
RECT rect;
HPEN hPen;
hDC = BeginPaint(hWnd, &PS );
hPen = (HPEN)GetStockObject(WHITE_PEN);
SelectObject(hDC, hPen) ;
GetClientRect(hWnd, &rect) ;
//---------- printing
MoveToEx(hDC, rect.right/2, 0, NULL);
LineTo(hDC,rect.right/2, rect.bottom);
MoveToEx(hDC, 0, rect.bottom/2, NULL);
LineTo(hDC,rect.right, rect.bottom/2);
for (x = 0, y = 0 ; (rect.right/2+x<=rect.right) && (rect.right/2+x >= rect.left) && (rect.bottom/2 - sqrt(x*a+b)<=rect.bottom) && (rect.bottom/2 - sqrt(x*a+b) >=rect.top) ; x+=0.01)
{
SetPixel(hDC, rect.right/2+x, rect.bottom/2 - sqrt(x*a+b), RGB(0xff, 0xff, 0xff) );
}
//----------- end of print
EndPaint(hWnd, &PS);
return 0 ;
case WM_DESTROY :
PostQuitMessage(0);
return 0;
//################### WM_COMMAND
case WM_COMMAND :
switch(wParam)
{
case IDM_EXIT :
PostQuitMessage(0);
return 0 ;
case IDM_SETA :
hDlg = (HWND)DialogBox(t, "SetDlg", hWnd, DialogProc);
if(ansver==0) return 0 ;
a=v;
InvalidateRect(hWnd, 0, true );
return 0;
case IDM_SETB :
hDlg =(HWND) DialogBox(t, "SetDlg", hWnd, DialogProc);
if(ansver==0)
return 0 ;
b=v;
InvalidateRect(hWnd, 0, true );
return 0 ;
}
}
return DefWindowProc(hWnd, uMsg, wParam, lParam) ;
}
BOOL CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
if(uMsg == WM_COMMAND)
switch(wParam)
{
case 104 :
GetDlgItemText(hwndDlg, 106, buffer, 20);
v = atoi(buffer);
ansver = 1 ;
EndDialog(hwndDlg, 0);
return 0;
case 105 :
ansver = 0 ;
EndDialog(hwndDlg, 0);
return 0;
}
return 0;
}
#include <winuser.h>
#include <math.h>
#include <string.h>
//##################### CONST ####################################//
#define IDM_EXIT 101
#define IDM_SETA 102
#define IDM_SETB 103
//===================== gloval ===================================//
char CName[] = "Primitive" ;
HWND hWnd, hDlg ;
MSG mmsg ;
int a=200, b=10, v,ansver ;
float x,y ;
HINSTANCE t;
char buffer[30];
HACCEL hAccel ;
//===================== proto ====================================//
LRESULT CALLBACK WndProc1(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) ;
BOOL CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
//===================== main
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int )
{
t = hInst ;
//------ register
WNDCLASS wc ;
wc.style = CS_HREDRAW || CS_VREDRAW ;
wc.lpfnWndProc = WndProc1 ;
wc.cbClsExtra = 0 ;
wc.cbWndExtra = 0 ;
wc.hInstance = hInst ;
wc.hIcon = LoadIcon(0, IDI_APPLICATION ) ;
wc.hCursor = LoadCursor(0, IDC_ARROW ) ;
wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH ) ;
wc.lpszMenuName = "MyMenu" ;
wc.lpszClassName = CName ;
RegisterClass(&wc);
//------ create
hWnd = CreateWindow(CName, CName, WS_OVERLAPPEDWINDOW , CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL, NULL, hInst, NULL) ;
if(!hWnd)
{
MessageBox(0, "Can't create window", "Error", 0) ;
return 0 ;
}
//----- Load accelerators
hAccel = LoadAccelerators(hInst, "MyMenu") ;
//------ show
ShowWindow(hWnd, SW_MAXIMIZE) ;
UpdateWindow(hWnd) ;
//------ msg loop
while( GetMessage(&mmsg, NULL, NULL, NULL) )
{
TranslateAccelerator(hWnd, hAccel, &mmsg) ;
TranslateMessage(&mmsg) ;
DispatchMessage(&mmsg) ;
}
return mmsg.wParam ;
}
//========== wnd proc
LRESULT CALLBACK WndProc1(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch(uMsg)
{
//################### WM_PAINT
case WM_PAINT :
HDC hDC ;
PAINTSTRUCT PS ;
RECT rect;
HPEN hPen;
hDC = BeginPaint(hWnd, &PS );
hPen = (HPEN)GetStockObject(WHITE_PEN);
SelectObject(hDC, hPen) ;
GetClientRect(hWnd, &rect) ;
//---------- printing
MoveToEx(hDC, rect.right/2, 0, NULL);
LineTo(hDC,rect.right/2, rect.bottom);
MoveToEx(hDC, 0, rect.bottom/2, NULL);
LineTo(hDC,rect.right, rect.bottom/2);
for (x = 0, y = 0 ; (rect.right/2+x<=rect.right) && (rect.right/2+x >= rect.left) && (rect.bottom/2 - sqrt(x*a+b)<=rect.bottom) && (rect.bottom/2 - sqrt(x*a+b) >=rect.top) ; x+=0.01)
{
SetPixel(hDC, rect.right/2+x, rect.bottom/2 - sqrt(x*a+b), RGB(0xff, 0xff, 0xff) );
}
//----------- end of print
EndPaint(hWnd, &PS);
return 0 ;
case WM_DESTROY :
PostQuitMessage(0);
return 0;
//################### WM_COMMAND
case WM_COMMAND :
switch(wParam)
{
case IDM_EXIT :
PostQuitMessage(0);
return 0 ;
case IDM_SETA :
hDlg = (HWND)DialogBox(t, "SetDlg", hWnd, DialogProc);
if(ansver==0) return 0 ;
a=v;
InvalidateRect(hWnd, 0, true );
return 0;
case IDM_SETB :
hDlg =(HWND) DialogBox(t, "SetDlg", hWnd, DialogProc);
if(ansver==0)
return 0 ;
b=v;
InvalidateRect(hWnd, 0, true );
return 0 ;
}
}
return DefWindowProc(hWnd, uMsg, wParam, lParam) ;
}
BOOL CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
if(uMsg == WM_COMMAND)
switch(wParam)
{
case 104 :
GetDlgItemText(hwndDlg, 106, buffer, 20);
v = atoi(buffer);
ansver = 1 ;
EndDialog(hwndDlg, 0);
return 0;
case 105 :
ansver = 0 ;
EndDialog(hwndDlg, 0);
return 0;
}
return 0;
}
MENUITEM "E&xit"
вместо
MENUITEM "&EXIT"
и
Код:
MyMenu ACCELERATORS
{
"A", 102, VIRTKEY, ALT, NOINVERT
"B", 103, VIRTKEY, ALT, NOINVERT
"X", 101, VIRTKEY, ALT, NOINVERT
}
{
"A", 102, VIRTKEY, ALT, NOINVERT
"B", 103, VIRTKEY, ALT, NOINVERT
"X", 101, VIRTKEY, ALT, NOINVERT
}
Ведь я должен запустить, потом нажать a и должен вылезти диалог. Наверное я чтото намудрил в самом коде. Не в ресурсах, а в коде.
Цитата:
Originally posted by DEHUNTER
Чтото и после этих изменений не работает.
Ведь я должен запустить, потом нажать a и должен вылезти диалог. Наверное я чтото намудрил в самом коде. Не в ресурсах, а в коде.
Чтото и после этих изменений не работает.
Ведь я должен запустить, потом нажать a и должен вылезти диалог. Наверное я чтото намудрил в самом коде. Не в ресурсах, а в коде.
Не a, а Alt+a.
Для того, чтоб сработал простой A, нужно
"A", 102, VIRTKEY, NOINVERT
Смотреть приятно. Так держать!
switch(LOWORD(wparam))
не работает. Может в опциях проекта чтото не то поставил ? А файле ресурсов мне кажется всё правильно. Как я понимаю TranslateAccelerator(...)
посылает WM_COMMAND.
Тоесть это точе самое чтобы я ткнул в меню.
Тогда мне нужно всего лиш сделать TranslateAccelerator в обработке сообшений. И обьявить таблицу акселераторов в ресурсах.
Если это так то я непонимаю почему этот код не работает.
Код:
while( GetMessage(&mmsg, NULL, NULL, NULL) )
{
if(!TranslateAccelerator(hWnd, hAccel, &mmsg))
{
TranslateMessage(&mmsg) ;
DispatchMessage(&mmsg) ;
}
}
{
if(!TranslateAccelerator(hWnd, hAccel, &mmsg))
{
TranslateMessage(&mmsg) ;
DispatchMessage(&mmsg) ;
}
}
Кроме этого, хорошо было бы проверить hAccel не равно ли NULL, после
hAccel = LoadAccelerators(hInst, "MyMenu")
WM_COMMAND
The WM_COMMAND message is sent when the user selects a command item from a menu, when a control sends a notification message to its parent window, or when an accelerator keystroke is translated.
A window receives this message through its WindowProc function.
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_COMMAND
WPARAM wParam, // notification code and identifier
LPARAM lParam // handle to control (HWND)
);
Parameters
wParam
The high-order word specifies the notification code if the message is from a control. If the message is from an accelerator, this value is 1. If the message is from a menu, this value is zero.
The low-order word specifies the identifier of the menu item, control, or accelerator.
lParam
Handle to the control sending the message if the message is from a control. Otherwise, this parameter is NULL.
Return Values
If an application processes this message, it should return zero.
Вообще-то перед первым постом я прогнал твой код.
Command он посылает и в том виде, что у тебя в первоначальном варианте, хотя и "the application should not use the TranslateMessage function to process the message again."
В принципе, возможна путанница изза того, что акселераторы и menu items имеют одинаковые ID
(ведь у меню у тебя есть еще и свои акселераторы
(Alt+F,Alt+A,Ctrl+a,Ctrl+b)), но мне оказалось
достачным сделать только то изменение, что я
указал в первом посте.
Спасибо. Теперь всё работает.