Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Accelerators

5.1K
01 ноября 2004 года
DEHUNTER
17 / / 12.03.2004
Чтото не получается у меня с акселераторами. Вродебы код правильный, а не работает.
Посмотрите пожалуста.
Код:
//####################### 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
}



Код:
#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;
}
368
01 ноября 2004 года
rostyslav
629 / / 13.07.2004
может
MENUITEM "E&xit"
вместо
MENUITEM "&EXIT"

и
 
Код:
MyMenu ACCELERATORS
{
    "A", 102,      VIRTKEY, ALT, NOINVERT
    "B", 103,      VIRTKEY, ALT, NOINVERT
    "X", 101,      VIRTKEY, ALT, NOINVERT
}
5.1K
02 ноября 2004 года
DEHUNTER
17 / / 12.03.2004
Чтото и после этих изменений не работает.
Ведь я должен запустить, потом нажать a и должен вылезти диалог. Наверное я чтото намудрил в самом коде. Не в ресурсах, а в коде.
368
02 ноября 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by DEHUNTER
Чтото и после этих изменений не работает.
Ведь я должен запустить, потом нажать a и должен вылезти диалог. Наверное я чтото намудрил в самом коде. Не в ресурсах, а в коде.


Не a, а Alt+a.

Для того, чтоб сработал простой A, нужно
"A", 102, VIRTKEY, NOINVERT

430
02 ноября 2004 года
craftyfox
157 / / 20.02.2000
Оформление кода обалденное!
Смотреть приятно. Так держать!
switch(LOWORD(wparam))
5.1K
03 ноября 2004 года
DEHUNTER
17 / / 12.03.2004
Я пробывал и второй вариант(без алт) -
не работает. Может в опциях проекта чтото не то поставил ? А файле ресурсов мне кажется всё правильно. Как я понимаю TranslateAccelerator(...)
посылает WM_COMMAND.
Тоесть это точе самое чтобы я ткнул в меню.
Тогда мне нужно всего лиш сделать TranslateAccelerator в обработке сообшений. И обьявить таблицу акселераторов в ресурсах.
Если это так то я непонимаю почему этот код не работает.
368
03 ноября 2004 года
rostyslav
629 / / 13.07.2004
 
Код:
while( GetMessage(&mmsg, NULL,  NULL, NULL) )
{
  if(!TranslateAccelerator(hWnd, hAccel, &mmsg))
  {
    TranslateMessage(&mmsg) ;
    DispatchMessage(&mmsg) ;
  }
}

Кроме этого, хорошо было бы проверить hAccel не равно ли NULL, после
hAccel = LoadAccelerators(hInst, "MyMenu")
430
03 ноября 2004 года
craftyfox
157 / / 20.02.2000
Из MSDN:
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)), но мне оказалось
достачным сделать только то изменение, что я
указал в первом посте.
5.1K
04 ноября 2004 года
DEHUNTER
17 / / 12.03.2004
Спасибо. Теперь всё работает.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог