Am o aplicatie Win32 in care creez un dialog cu diferite controale. Functioneaza perfect pana cand adaug, sa zicem, un listview. Dialogul nu mai apare, iar functia care ar trebui sa-l creeze intoarce eroare (de exemplu DialogBox
intoarce -1). Mai mult, daca pun un apel la GetLastError, acesta intoarce 0 (zero), nedandu-mi astfel nici o informatie.
Rezolvare
Trebuie sa initializam (inregistram) controalele respective. O solutie este un apel la functia InitCommonControls. Este o solutie simpla pentru ca face totul "dintr-un foc". Totusi, in documentatie se spune ca aceasta functie este invechita (obsolete) si se recomanda folosirea lui InitCommonControlsEx.
Deci ca sa rezolvam problema trebuie sa facem urmatoarele:
- includem headerul commctrl.h;
- legam proiectul la comctl32.lib in proprietatile pentru linker sau utilizand directiva #pragma comment;
- apelam functia InitCommonControlsEx pentru a initializa controalele necesare.
Exemplu
Code: Select all
#include <windows.h>
#include <commctrl.h>
#include "resource.h"
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void RegisterCommonControls();
#pragma comment(lib, "comctl32.lib")
void RegisterCommonControls()
{
INITCOMMONCONTROLSEX iccex = {0};
iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
iccex.dwICC = ICC_LISTVIEW_CLASSES; // list view and header control classes
// see INITCOMMONCONTROLSEX in MSDN for a complete list
InitCommonControlsEx(&iccex);
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
RegisterCommonControls();
INT_PTR nRet = DialogBox(hInstance, // handle to module
MAKEINTRESOURCE(IDD_DIALOG1), // dialog box template
NULL, // handle to owner window
DialogProc); // dialog box procedure
return 0;
}
- Lista cu flag-urile care seteaza care controale vor fi initializate se gaseste in MSDN la documentatia pentru structura INITCOMMONCONTROLSEX sau direct in headerul commctrl.h.
- Un loc mai aparte reprezinta controlul rich edit. Pentru initiaslizarea acestuia se foloseate functia LoadLibrary cu care se incarca RICHED32.DLL (rich edit versiunea 1.0) sau RICHED20.DLL (rich edit versiunea 2.0 sau 3.0).
<< Back to Windows API Index