На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Creating a Template in Memory



Applications sometimes adapt or modify the content of dialog boxes depending on the current state of the data being processed. In such cases, it is not practical to provide all possible dialog box templates as resources in the application's executable file. But creating templates in memory gives the application more flexibility to adapt to any circumstances.

In the following example, the application creates a template in memory for a modal dialog box that contains a message and OK and Help buttons.
In a dialog template, all character strings, such as the dialog box and button titles, must be Unicode strings. This example uses the MultiByteToWideChar function to generate these Unicode strings, because both Windows NT and Windows 95 support MultiByteToWideChar
The DLGITEMTEMPLATE structures in a dialog template must be aligned on DWORD boundaries. To align these structures, this example uses a helper routine that takes an input pointer and returns the closest pointer that is aligned on a DWORD (4 byte) boundary.

#define ID_HELP 150
#define ID_TEXT 200

LPWORD lpwAlign ( LPWORD lpIn)
{
ULONG ul;

ul = (ULONG) lpIn;
ul +=3;
ul >>=2;
ul <<=2;
return (LPWORD) ul;
}

LRESULT DisplayMyMessage(HINSTANCE hinst, HWND hwndOwner,
LPSTR lpszMessage)
{
HGLOBAL hgbl;
LPDLGTEMPLATE lpdt;
LPDLGITEMTEMPLATE lpdit;
LPWORD lpw;
LPWSTR lpwsz;
LRESULT ret;
int nchar;

hgbl = GlobalAlloc(GMEM_ZEROINIT, 1024);
if (!hgbl)

return -1;

lpdt = (LPDLGTEMPLATE)GlobalLock(hgbl);

// Define a dialog box.

lpdt->style = WS_POPUP | WS_BORDER | WS_SYSMENU
| DS_MODALFRAME | WS_CAPTION;
lpdt->cdit = 3; // number of controls
lpdt->x = 10; lpdt->y = 10;
lpdt->cx = 100; lpdt->cy = 100;

lpw = (LPWORD) (lpdt + 1);
*lpw++ = 0; // no menu
*lpw++ = 0; // predefined dialog box class (by default)

lpwsz = (LPWSTR) lpw;

nchar = 1+ MultiByteToWideChar (CP_ACP, 0, "My Dialog",
-1, lpwsz, 50);
lpw += nchar;

//-----------------------
// Define an OK button.
//-----------------------
lpw = lpwAlign (lpw); // align DLGITEMTEMPLATE on DWORD boundary
lpdit = (LPDLGITEMTEMPLATE) lpw;
lpdit->x = 10; lpdit->y = 70;
lpdit->cx = 80; lpdit->cy = 20;
lpdit->id = IDOK; // OK button identifier
lpdit->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;


lpw = (LPWORD) (lpdit + 1);
*lpw++ = 0xFFFF;
*lpw++ = 0x0080; // button class

lpwsz = (LPWSTR) lpw;
nchar = 1+MultiByteToWideChar (CP_ACP, 0, "OK", -1, lpwsz, 50);
lpw += nchar;
lpw = lpwAlign (lpw); // align creation data on DWORD boundary
*lpw++ = 0; // no creation data

//-----------------------
// Define a Help button.
//-----------------------
lpw = lpwAlign (lpw); // align DLGITEMTEMPLATE on DWORD boundary

lpdit = (LPDLGITEMTEMPLATE) lpw;
lpdit->x = 55; lpdit->y = 10;
lpdit->cx = 40; lpdit->cy = 20;
lpdit->id = ID_HELP; // Help button identifier
lpdit->style = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;

lpw = (LPWORD) (lpdit + 1);
*lpw++ = 0xFFFF;
*lpw++ = 0x0080; // button class atom

lpwsz = (LPWSTR) lpw;
nchar = 1+MultiByteToWideChar (CP_ACP, 0, "Help", -1, lpwsz, 50);
lpw += nchar;
lpw = lpwAlign (lpw); // align creation data on DWORD boundary

*lpw++ = 0; // no creation data

//-----------------------
// Define a static text control.
//-----------------------
lpw = lpwAlign (lpw); // align DLGITEMTEMPLATE on DWORD boundary
lpdit = (LPDLGITEMTEMPLATE) lpw;
lpdit->x = 10; lpdit->y = 10;
lpdit->cx = 40; lpdit->cy = 20;
lpdit->id = ID_TEXT; // text identifier
lpdit->style = WS_CHILD | WS_VISIBLE | SS_LEFT;

lpw = (LPWORD) (lpdit + 1);
*lpw++ = 0xFFFF;

*lpw++ = 0x0082; // static class

for (lpwsz = (LPWSTR)lpw;
*lpwsz++ = (WCHAR) *lpszMessage++;
);
lpw = (LPWORD)lpwsz;
lpw = lpwAlign (lpw); // align creation data on DWORD boundary
*lpw++ = 0; // no creation data

GlobalUnlock(hgbl);
ret = DialogBoxIndirect(hinst, (LPDLGTEMPLATE) hgbl,
hwndOwner, (DLGPROC) DialogProc);
GlobalFree(hgbl);
return ret;
}



Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Создание Шаблона в Памяти



Приложения иногда приспосабливают или модифицируют содержимое диалоговых блоков в зависимости от текущего состояния данных, обрабатыванных. В таких случаях, это не практическое, чтобы обеспечивать все возможные диалоговые шаблоны блока как ресурсы в прикладном выполняемом файле. Но создание шаблонов в памяти дает приложению более гибкость приспосабливаться в любые обстоятельства.

В следующем примере, приложение создает шаблон в памяти для модального диалогового блока, который содержит сообщение и OK и кнопки Подсказки.
В диалоговом шаблоне, всех символьных строках, как например, диалоговый блок и названия кнопки, должны быть строки Уникода. Этот пример использует функцию MultiByteToWideChar, чтобы генерировать эти строки Уникода, поскольку как Windows NT так и поддержка Windows 95 MultiByteToWideChar структуры DLGITEMTEMPLATE в диалоговом шаблоне должны быть выровнены на границах DWORD. Для того, чтобы выравнивать эти структуры, этот пример использует программу помощника, которая берет входной указатель и возвращает ближайший указатель, который выровнен на DWORD границы (4 байта).

#define ID_HELP 150 #define ID_TEXT 200

LPWORD lpwAlign ( LPWORD lpIn)
{
ul ULONG;

страх.лаб. = (ULONG) lpIn;
страх.лаб. +=3;
страх.лаб. >>=2;
страх.лаб. <<=2;
возврат ul (LPWORD);
}

LRESULT DisplayMyMessage(HINSTANCE hinst, HWND hwndOwner, lpszMessage LPSTR)
{
HGLOBAL hgbl;
LPDLGTEMPLATE lpdt;
LPDLGITEMTEMPLATE lpdit;
lpw LPWORD;
LPWSTR lpwsz;
ret LRESULT;
int nchar;

hgbl = GlobalAlloc(GMEM_ZEROINIT, 1024);
если (!hgbl)

возврат -1;

lpdt = (LPDLGTEMPLATE)GlobalLock(hgbl);

// Определите диалогового блока.

lpdt->style = WS_POPUP | WS_BORDER | WS_SYSMENU | DS_MODALFRAME | WS_CAPTION;
lpdt->cdit = 3; // количество элементов управления lpdt->x = 10; lpdt->y = 10;
lpdt->cx = 100; lpdt->cy = 100;

lpw = (LPWORD) (lpdt + 1);
*lpw++ = 0; // никакое меню *lpw++ = 0; // встроенный диалоговый класс блока (по умолчанию)

lpwsz = lpw (LPWSTR);

nchar = 1+ MultiByteToWideChar (CP_ACP, 0, "Мой Диалог", -1, lpwsz, 50);
lpw += nchar;

//-----------------------
// Определите кнопку OK.
//-----------------------
lpw = lpwAlign (lpw); // выровняйте DLGITEMTEMPLATE на границе DWORD lpdit = lpw (LPDLGITEMTEMPLATE);
lpdit->x = 10; lpdit->y = 70;
lpdit->cx = 80; lpdit->cy = 20;
lpdit->id = IDOK; // ИДЕНТИФИКАТОР кнопки OK lpdit->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;


lpw = (LPWORD) (lpdit + 1);
*lpw++ = 0xFFFF;
*lpw++ = 0x0080; // класс кнопки

lpwsz = lpw (LPWSTR);
nchar = 1+MultiByteToWideChar (CP_ACP, 0, "OK", -1, lpwsz, 50);
lpw += nchar;
lpw = lpwAlign (lpw); // выровняйте данные создания о границе DWORD *lpw++ = 0; // никакие данные создания

//-----------------------
// Определите кнопку Подсказки.
//-----------------------
lpw = lpwAlign (lpw); // выровняйте DLGITEMTEMPLATE на границе DWORD

lpdit = lpw (LPDLGITEMTEMPLATE);
lpdit->x = 55; lpdit->y = 10;
lpdit->cx = 40; lpdit->cy = 20;
lpdit->id = ID_HELP; // Помогите идентификатору кнопки lpdit->style = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;

lpw = (LPWORD) (lpdit + 1);
*lpw++ = 0xFFFF;
*lpw++ = 0x0080; // атом класса кнопки

lpwsz = lpw (LPWSTR);
nchar = 1+MultiByteToWideChar (CP_ACP, 0, "Подсказка", -1, lpwsz, 50);
lpw += nchar;
lpw = lpwAlign (lpw); // выровняйте данные создания о границе DWORD

*lpw++ = 0; // никакие данные создания

//-----------------------
// Определите статическое текстовое управление.
//-----------------------
lpw = lpwAlign (lpw); // выровняйте DLGITEMTEMPLATE на границе DWORD lpdit = lpw (LPDLGITEMTEMPLATE);
lpdit->x = 10; lpdit->y = 10;
lpdit->cx = 40; lpdit->cy = 20;
lpdit->id = ID_TEXT; // текстовый идентификатор lpdit->style = WS_CHILD | WS_VISIBLE | SS_LEFT;

lpw = (LPWORD) (lpdit + 1);
*lpw++ = 0xFFFF;

*lpw++ = 0x0082; // статический класс

для (lpwsz = (LPWSTR)lpw;
*lpwsz++ = (WCHAR) *lpszMessage++;
);
lpw = (LPWORD)lpwsz;
lpw = lpwAlign (lpw); // выровняйте данные создания о границе DWORD *lpw++ = 0; // никакие данные создания

GlobalUnlock(hgbl);
ret = DialogBoxIndirect(hinst, (LPDLGTEMPLATE) hgbl, hwndOwner, (DLGPROC) DialogProc);
GlobalFree(hgbl);
возврат ret;
}



Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz