Как использовать ресурсы Dialog в Win32? - PullRequest
5 голосов
/ 18 ноября 2011

Без ресурсов я могу создать свой пользовательский интерфейс со сложным массивом CreateWindow() и CreateWindowEx() и WndProc() для обработки моих событий.

Я заметил, что если щелкнуть правой кнопкой мыши в представлении ресурсов инажмите «добавить ресурс», я могу нарисовать диалоговое окно со всеми элементами управления.Это сэкономило бы мне огромное количество времени, если бы я мог нарисовать интерфейс, как я обычно делаю с C #.

После того, как я нарисовал интерфейс с помощью редактора ресурсов, как мне затем создать окно из кода?Может ли кто-нибудь привести очень простой пример с кнопкой и показать, как обрабатывать событие WM_COMMAND для этой кнопки, пожалуйста?

Кроме того, это обычно, как люди создают графический интерфейс?Есть ли потери в гибкости, чтобы сделать это?Даже в C # мне часто приходится дополнять сгенерированный дизайнером пользовательский интерфейс своим собственным сгенерированным кодом пользовательским интерфейсом, но большую часть времени я очень рад использовать дизайнер.

Ответы [ 2 ]

5 голосов
/ 18 ноября 2011

После создания диалогового окна в редакторе ресурсов вызовите CreateDialog (немодальное диалоговое окно; вам нужно отправлять сообщения вручную, как при использовании CreateWindow) или DialogBox (модальное диалоговое окно; функция не возвращается до Вы закрываете диалоговое окно. Он выполняет диспетчеризацию за вас), чтобы диалоговое окно отображалось. Точно так же, как вы передаете в окне proc в RegisterClass, вы передаете proc диалога этим функциям для обратного вызова диалога. Пример DialogProc выглядит следующим образом:

BOOL DialogProc( HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam ){
    switch( iMessage ){
    case WM_COMMAND:
        switch( LOWORD( wParam ) ){
        case BTOK:
            MessageBox( hDlg, "Hello, World!", NULL, NULL );
            return TRUE;
            break;
        }
        break;
    }
    return FALSE;
}

Это основной способ создания диалога. Более сложный метод обычно включает ООП, обычно оборачивая каждый ресурс (кнопку, окно и т. Д.) В объект C ++ или используя MFC.

1 голос
/ 18 ноября 2011

Если вы поместили свою кнопку или какой-либо элемент управления в какое-либо диалоговое окно, этот элемент управления уже находится в созданном состоянии.Для обработки сообщений этих дочерних элементов управления в этом диалоговом окне необходимо переопределить метод OnCommand в классе, реализующем ваше диалоговое окно.

Например:

//CDialog_ControlDlg is my Dialog class derived from CDialog

//IDC_BUTTON_SAMPLE is the ID of the button which was palced on the dialog in the resource Editor..

BOOL CDialog_ControlDlg::OnCommand(WPARAM wParam,LPARAM lparam){
      int iNotiFicationMsg=HIWORD(wParam);//This is thenotification Msg from the child control
      int iCommandId=LOWORD(wParam);//And Control ID of the Child control which caused that Msg
      BOOL result=FALSE;
      switch(iCommandId){
    case IDC_BUTTON_SAMPLE:
        if(iNotiFicationMsg==BN_CLICKED)
        {
         //Your Code for handling this type of Msg for this control..

        }
        break;
    default:
    {
        //Specific Code;

    }

    return result;
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...