Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Использование немодального диалога

Rusa


Использование немодального диалога 10510w2224k



Win

В завершение данной главы преобразуем модальный диалог из предыдущего примера в немодальный. Использование немодального диалога 10510w2224k потребует несколько больше усилий, чем использование модального, - в основном потому, что немо­дальный диалог является более независимым окном, нежели модальный. В процессе работы немодального диалога 10510w2224k программа остается активной, так что диалог и породившее его окно продолжают получать сообщения. Таким образом, для включения в программу немодального диалога 10510w2224k необходимо вставить дополнительный фрагмент в цикл обработки сообщений Вашей программы.

Для создания немодального диалога 10510w2224k вместо функции DialogBox API CreateDialog

HWND CreateDialog(HINSTANCE hThisInst,

LPCSTR lpName,

HWND hwnd

DLGPROC IpDFunc

hThisInst WinMain lpName - имя диалога 10510w2224k , опреде­ленное в файле ресурсов, hwnd - дескриптор родительского окна для диалога 10510w2224k , а lpDFunc - указатель на функцию диалога 10510w2224k . Функция диалога 10510w2224k в данном случае должна быть описана так же, как и для модального диалога 10510w2224k .

ShowWindow . Однако если при определении диалога 10510w2224k в файле ресурсов добавить стиль WS VISIBLE

Для завершения немодального диалога 10510w2224k программа должна вызвать функцию DestroyWindow EndDialog DestroyWindow

BOLL DestroyWindow HWND hwnd

hwnd должен задавать дескриптор закрываемого окна (в данном случае диалога 10510w2224k ).

IsDialogMessage , направляющей сообщения диалога 10510w2224k Вашему немодальному диалогу:



BOOL IsDialogMessage(HWND hdwnd, LPMSG msg);

hdwnd содержит дескриптор окна немодального диалога 10510w2224k , a msg GetMessage . Эта функция возвращает ненулевое значение, если сообщение предназначено для диалога 10510w2224k , и нуль в противном случае. Если сообщение предназначено для диалога 10510w2224k , оно будет автоматически направлено ему. Таким образом, для работы с немодальным диалогом цикл обработки сообщений Вашей программы должен выглядеть следующим образом:

while(GetMessage(&msg,NULL,0,0))

if(!IsDialogMessage(hDlg,&msg))

if(!TranslateAccelerator(hwnd,hAccel,&msg))

Как видите, сообщение обрабатывается обычным образом только в том случае, если оно не предназначено для диалога 10510w2224k .

Создание немодального диалога 10510w2224k . Преобразование модального диалога 10510w2224k из предыдущего примера в немодальный потребует небольших изменений в программе. Прежде всего необходимо внести изменения в файл ресурсов Mydialog rc. Поскольку немодальный диалог при создании не отображается автоматически, добавьте в определение диалога 10510w2224k стиль WS VISIBLE Mydialog rc

#include "Mydialog.h"

#include <Windows.h>

MYMENU MENU

MYMENU ACCELERATORS

MYDB DIALOG 18, 18, 142, 92

CAPTION " "

STYLE DS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENU|

WS_VISIBLE

IsDialogMessage

CreateDialog DialogBox

3) для закрытия диалога 10510w2224k заменить функцией DestroyWindows EndDialog



. Полный текст программы, использующей немодальный диалог (с внесенными изменениями), приводится ниже. Пример работы программы приведен на рис. 5.4. Обязательно попробуйте запустить эту программу, чтобы полностью понять разницу между модальным и немодальным диалога 10510w2224k ми.

// Демонстрация немодального диалога 10510w2224k

include <Windows h>

#include <String.h>

#include <Stdio.h>

#include "Mydialog.h"

LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM); BOOL CALLBACK DialogFunc(HWND,UINT,WPARAM,LPARAM);

char szWinName[]="МоеОкно"; // Имя класса окна

HINSTANCE hInst;

HWND hDlg;  // диалога 10510w2224k

int WINAPI WinMain(HINSTANCE hThisInst,

HINSTANCE hPrevInst,

LPSTR lpszArgs,

int nWinMode)

return msg wParam

}

Windows

LRESULT CALLBACK WindowFunc HWND hwnd

UINT message,

WPARAM wParam,

LPARAM lParam)

break;

case WM DESTROY

PostQuitMessage

break

default // Все сообщения, не обрабатываемые

// в данной функции, направляются

// на обработку по умолчанию

return DefWindowProc(hwnd, message,

wParam, lParam);

}

return 0;



}

// Простая функция диалога 10510w2224k

BOOL CALLBACK DialogFunc(HWND hdwnd,

UINT message,

WPARAM wParam,

LPARAM lParam)

return 1;

case IDD_SELFRUIT: //Кнопка "Выбери фрукт"

i=SendDlgItemMessage(hdwnd,ID_LB1,

LB_GETCURSEL,

0, 0L);

if( i > -1)

sprintf

(str

"Индекс выбранного элемента %d",

i);

else

sprintf(str,"Фрукт не выбран");

MessageBox(hdwnd,str,"Сделан выбор",

MB_OK);

return 1;

case IDOK: // Кнопка IDOK "Конец ввода"

GetDlgItemText(hdwnd,ID_EB1,str,80);

MessageBox(hdwnd, str, "Содержимое окна ввода",

MB_OK);

return 1;

}

case WM_INITDIALOG: // Инициализация списка

SendDlgItemMessage(hdwnd, ID_LB1,

LB_ADDSTRING,

0, (LPARAM)"Яблоко");

SendDlgItemMessage(hdwnd, ID_LB1,

LB_ADDSTRING,

0, (LPARAM)"Апельсин");

SendDlgItemMessage(hdwnd, ID_LB1,

LB_ADDSTRING,

0, (LPARAM)"Груша");

SendDlgItemMessage(hdwnd, ID_LB1,

LB_ADDSTRING,

0, (LPARAM)"Виноград");

return 1;

return

}

https://www.scriru.com/10/38/32756648357.php




Document Info


Accesari: 2126
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2025 )