Poniżej zamieszczam działający kod przykładowego okna dialogowego.
Są w nim stare kontrolki (listbox, edit i button, oraz nowa kontrolka - treeView).
To jest w starym Borlandzie, więc być może kod będzie wymagał drobnego dopasowania do Twojego kompilatora.
Popatrz jak są obsługiwane powiadomienia dla różnych typów kontrolek.
#include <windows.h>
#include <commctrl.h>
#include "dialog.rh"
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){
switch(uMsg){
case WM_INITDIALOG:{
//Tu ustawić stan początkowy kontrolek
SendDlgItemMessage(hwndDlg, IDC_LISTBOX1, LB_ADDSTRING, 0, (LPARAM)"Test1");
SendDlgItemMessage(hwndDlg, IDC_LISTBOX1, LB_ADDSTRING, 0, (LPARAM)"Test2");
TV_INSERTSTRUCT tv;
tv.hParent=NULL;
tv.hInsertAfter=TVI_FIRST;
tv.item.mask=TVIF_TEXT;
tv.item.pszText="ROOT";
HTREEITEM root=TreeView_InsertItem(GetDlgItem(hwndDlg, IDC_LISTBOX2), &tv);
tv.hParent=root;
tv.item.pszText="Dziecko 1";
TreeView_InsertItem(GetDlgItem(hwndDlg, IDC_LISTBOX2), &tv);
tv.item.pszText="Dziecko 2";
TreeView_InsertItem(GetDlgItem(hwndDlg, IDC_LISTBOX2), &tv);
tv.item.pszText="Dziecko 3";
TreeView_InsertItem(GetDlgItem(hwndDlg, IDC_LISTBOX2), &tv);
TreeView_Expand(GetDlgItem(hwndDlg, IDC_LISTBOX2), root, TVE_EXPAND);
}
break;
case WM_NOTIFY:{//obsługa powiadomień dla kontrolek nowego typu
NMHDR* hdr=(NMHDR*)lParam;
switch(hdr->idFrom){
case IDC_LISTBOX2:
switch(hdr->code){
case TVN_SELCHANGED:{//zmiana wybranej pozycji
NM_TREEVIEW* item=(NM_TREEVIEW*)lParam;
//item zawiera informacje o zmienianych pozycjach
SetDlgItemText(hwndDlg, IDC_STATIC1, "TreeView zmieniło wybrana pozycję");
}
break;
case NM_KILLFOCUS://treeView utraciło focus
SetDlgItemText(hwndDlg, IDC_STATIC1, "treeView utraciło focus");
}
break;
}
}
break;
case WM_COMMAND://obsługa powiadomień dla kontrolek starego typu
switch(LOWORD(wParam)){
case IDC_EDIT1:
switch(HIWORD(wParam)){
case EN_KILLFOCUS:
//Pole pierwsze utraciło focus
SetDlgItemText(hwndDlg, IDC_STATIC1, "Pole pierwsze utraciło focus");
break;
}
break;
case IDC_EDIT2:
switch(HIWORD(wParam)){
case EN_KILLFOCUS:
//Pole drugie utraciło focus
SetDlgItemText(hwndDlg, IDC_STATIC1, "Pole drugie utraciło focus");
break;
}
break;
case IDC_LISTBOX1:
switch(HIWORD(wParam)){
case LBN_SELCHANGE:
//Lista zmeniła wybrana pozycję
SetDlgItemText(hwndDlg, IDC_STATIC1, "Lista zmeniła wybrana pozycję");
break;
case LBN_KILLFOCUS:
//Lista utracila focus
SetDlgItemText(hwndDlg, IDC_STATIC1, "Lista utraciła focus");
break;
}
break;
case IDOK:
//zamknięcie z kodem IDOK
//tu zatwierdzić wprowadzone zmiany
EndDialog(hwndDlg, IDOK);
break;
case IDCANCEL:
//zamknięcie z kodem IDCANCEL
//tu odwołać wprowadzone zmiany
EndDialog(hwndDlg, IDCANCEL);
break;
case IDC_PUSHBUTTON1:
switch(HIWORD(wParam)){
case BN_CLICKED:
SetDlgItemText(hwndDlg, IDC_STATIC1, "Kliknięty przycisk");
break;
case BN_KILLFOCUS:
SetDlgItemText(hwndDlg, IDC_STATIC1, "Przycisk stracił focus");
break;
}
break;
}
}
return (BOOL)FALSE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int){
InitCommonControls();
int retCode=DialogBox(hInstance, MAKEINTRESOURCE(DIALOG_1), NULL, (DLGPROC)DialogProc);
if(retCode==IDOK){
MessageBox(NULL, "Zamknięty dialog z kodem OK", "TEST", MB_OK);
//Tu zaktualizowac stan progreamu po zamkniętym dialogu z kodem IDOK
}
return TRUE;
}
/****************************************************************************
DIALOG.RC
produced by Borland Resource Workshop
*****************************************************************************/
#include "dialog.rh"
#define BS_NOTIFY 0x00004000L
DIALOG_1 DIALOG 6, 15, 207, 160
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "DIALOG_1"
FONT 8, "MS Sans Serif"
{
DEFPUSHBUTTON "OK", IDOK, 148, 116, 50, 14
PUSHBUTTON "Cancel", IDCANCEL, 148, 134, 50, 14
PUSHBUTTON "Button", IDC_PUSHBUTTON1, 14, 129, 50, 14, BS_NOTIFY
LISTBOX IDC_LISTBOX1, 14, 53, 49, 59, LBS_STANDARD
CONTROL "", IDC_LISTBOX2, "SysTreeView32", WS_BORDER|WS_CHILD | WS_VISIBLE | WS_TABSTOP, 83, 52, 49, 58
EDITTEXT IDC_EDIT1, 153, 58, 41, 12, WS_BORDER | WS_TABSTOP
EDITTEXT IDC_EDIT2, 153, 78, 41, 12, WS_BORDER | WS_TABSTOP
LTEXT "", IDC_STATIC1, 14, 11, 167, 12
}
/****************************************************************************
dialog.rh
produced by Borland Resource Workshop
*****************************************************************************/
#define DIALOG_1 1
#define IDC_PUSHBUTTON1 101
#define IDC_LISTBOX1 102
#define IDC_LISTBOX2 103
#define IDC_EDIT1 104
#define IDC_EDIT2 105
#define IDC_STATIC1 106
Jeśli dialog ma pełnić różne funkcje, to w zasobach dajesz wszystkie możliwe kombinacje kontrolek, a w WM_INITDIALOG ukrywasz te, które w danej konfiguracji nie są potrzebne.