BOOL CALLBACK Dlg Proc HWND h Dlg UINT
BOOL CALLBACK Dlg. Proc (HWND h. Dlg, UINT message, WPARAM w. Param, LPARAM l. Param) { static HWND h. Progress; switch (message) { case WM_INITDIALOG : h. Progress = Get. Dlg. Item(h. Dlg, IDC_PROGRESS 1); Send. Message(h. Progress, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); Send. Message(h. Progress, PBM_SETPOS, 0, 0); return TRUE ; case WM_COMMAND : switch (LOWORD (w. Param)) { case IDC_BUTTON 1: { for(int i = 0; i <= 100; i++) { Send. Message(h. Progress, PBM_SETPOS, i, 0); Sleep(50); } } return TRUE; case IDOK : case IDCANCEL : End. Dialog (h. Dlg, 0) ; return TRUE ; } break ; } return FALSE ; }
BOOL CALLBACK Dlg. Proc (HWND h. Dlg, UINT message, WPARAM w. Param, LPARAM l. Param) { static HWND h. Progress; static HWND h. Edit; static HWND h. Track. Bar; switch (message) { case WM_INITDIALOG : h. Progress = Get. Dlg. Item(h. Dlg, IDC_PROGRESS 1); Send. Message(h. Progress, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); Send. Message(h. Progress, PBM_SETPOS, 0, 0); h. Track. Bar = Get. Dlg. Item(h. Dlg, IDC_SLIDER 1); Send. Message(h. Track. Bar, TBM_SETRANGE, 0, MAKELPARAM(0, 100)); Send. Message(h. Track. Bar, TBM_SETPOS, 0, 0); h. Edit = Get. Dlg. Item(h. Dlg, IDC_EDIT 1); return TRUE ; case WM_HSCROLL: { int i. Return. Ctrl = Get. Dlg. Ctrl. ID((HWND)l. Param); switch (i. Return. Ctrl) { case IDC_SLIDER 1: { int i. Pos; i. Pos = Send. Message(h. Track. Bar, TBM_GETPOS, NULL); char temp[256]; wsprintf(temp, "%d", i. Pos); Set. Window. Text(h. Edit, temp); } break; } } return TRUE;
case WM_COMMAND : switch (LOWORD (w. Param)) { case IDC_BUTTON 1: { for(int i = 0; i <= 100; i++) { Send. Message(h. Progress, PBM_SETPOS, i, 0); Sleep(50); } } return TRUE; case IDOK : case IDCANCEL : End. Dialog (h. Dlg, 0) ; return TRUE ; } break ; } return FALSE ; }
BOOL CALLBACK Dlg. Proc (HWND h. Dlg, UINT message, WPARAM w. Param, LPARAM l. Param) { static HWND h. Progress; static HWND h. Edit, h. Edit 2; static HWND h. Track. Bar; static HWND h. Spin; switch (message) { case WM_INITDIALOG : { h. Progress = Get. Dlg. Item(h. Dlg, IDC_PROGRESS 1); Send. Message(h. Progress, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); Send. Message(h. Progress, PBM_SETPOS, 0, 0); h. Track. Bar = Get. Dlg. Item(h. Dlg, IDC_SLIDER 1); Send. Message(h. Track. Bar, TBM_SETRANGE, 0, MAKELPARAM(0, 100)); Send. Message(h. Track. Bar, TBM_SETPOS, 0, 0); h. Edit = Get. Dlg. Item(h. Dlg, IDC_EDIT 1); h. Edit 2 = Get. Dlg. Item(h. Dlg, IDC_EDIT 2); h. Spin = Get. Dlg. Item(h. Dlg, IDC_SPIN 1); Send. Message(h. Spin, UDM_SETRANGE, 0, MAKELPARAM(1000, 0)); Send. Message(h. Spin, UDM_SETBUDDY, (WPARAM)h. Edit 2, NULL); static UDACCEL ud. Accel[3] = {{0, 1}, {5, 10}, {8, 20}}; Send. Message(h. Spin, UDM_SETACCEL, (WPARAM)3, (LPARAM)ud. Accel); } return TRUE ;
case WM_HSCROLL: { int i. Return. Ctrl = Get. Dlg. Ctrl. ID((HWND)l. Param); switch (i. Return. Ctrl) { case IDC_SLIDER 1: { int i. Pos; i. Pos = Send. Message(h. Track. Bar, TBM_GETPOS, NULL); char temp[256]; wsprintf(temp, "%d", i. Pos); Set. Window. Text(h. Edit, temp); } break; } } return TRUE; case WM_COMMAND : switch (LOWORD (w. Param)) { case IDC_BUTTON 1: { for(int i = 0; i <= 100; i++) { Send. Message(h. Progress, PBM_SETPOS, i, 0); Sleep(50); } } return TRUE; case IDOK : case IDCANCEL : End. Dialog (h. Dlg, 0) ; return TRUE ; } break ; } return FALSE ; }
switch (message) { case WM_INITDIALOG : { h. Progress = Get. Dlg. Item(h. Dlg, IDC_PROGRESS 1); Send. Message(h. Progress, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); Send. Message(h. Progress, PBM_SETPOS, 0, 0); h. Track. Bar = Get. Dlg. Item(h. Dlg, IDC_SLIDER 1); Send. Message(h. Track. Bar, TBM_SETRANGE, 0, MAKELPARAM(0, 100)); Send. Message(h. Track. Bar, TBM_SETPOS, 0, 0); h. Edit = Get. Dlg. Item(h. Dlg, IDC_EDIT 1); h. Edit 2 = Get. Dlg. Item(h. Dlg, IDC_EDIT 2); h. Spin = Get. Dlg. Item(h. Dlg, IDC_SPIN 1); Send. Message(h. Spin, UDM_SETRANGE, 0, MAKELPARAM(1000, 0)); Send. Message(h. Spin, UDM_SETBUDDY, (WPARAM)h. Edit 2, NULL); static UDACCEL ud. Accel[3] = {{0, 1}, {5, 10}, {8, 20}}; Send. Message(h. Spin, UDM_SETACCEL, (WPARAM)3, (LPARAM)ud. Accel); HWND h. Animate = Get. Dlg. Item(h. Dlg, IDC_ANIMATE 1); Send. Message(h. Animate, ACM_OPEN, NULL, MAKELPARAM(IDR_AVI 1, 0)); Send. Message(h. Animate, ACM_PLAY, (WPARAM)-1, MAKELPARAM(0, -1)); } return TRUE ;
6. 핫키 Register. Hot. Key(h. Dlg, 1, MOD_ALT|MOD_CONTROL, 'X'); } return TRUE ; case WM_HOTKEY: Message. Box(h. Dlg, "핫키를 눌렀다. ", "핫키", MB_OK); return TRUE; case WM_COMMAND : switch (LOWORD (w. Param)) { case IDC_BUTTON 1: { for(int i = 0; i <= 100; i++) { Send. Message(h. Progress, PBM_SETPOS, i, 0); Sleep(50); } } return TRUE; case IDOK : case IDCANCEL : Unregister. Hot. Key(h. Dlg, 1); End. Dialog (h. Dlg, 0) ; return TRUE ; } break ;
7. 날짜 선택 컨트롤 – DWORD Date. Time_Get. Systemtime(HWND hwnd. DP, LPSYSTEMTIME p. Sys. Time) • 사용자가 선택한 날짜를 조사한다. – BOOL Date. Time_Set. Systemtime(HWND hwnd. DT, DWORD flag, LPSYSTEMTIME lp. Sys. Time); • flag : GDT_VALID h. DTP = Get. Dlg. Item(h. Dlg, IDC_DATETIMEPICKER 1); } return TRUE ; case WM_HOTKEY: { SYSTEMTIME st; Date. Time_Get. Systemtime(h. DTP, &st); char temp[256]; wsprintf(temp, "%d년 %d월 %d일", st. w. Year, st. w. Month, st. w. Day); Message. Box(h. Dlg, temp, "선택한 날짜", MB_OK); } return TRUE;
h. Status = Create. Status. Window(WS_CHILD|WS_VISIBLE, "Status Line", h. Dlg, 0); int Part. Array[3] = {100, 300, -1}; Send. Message(h. Status, SB_SETPARTS, (WPARAM)3, (LPARAM)Part. Array); } return TRUE ; case WM_MOUSEMOVE: { char temp[256]; wsprintf(temp, "x => %d. y => %d", LOWORD(l. Param), HIWORD(l. Param)); Send. Message(h. Status, SB_SETTEXT, (WPARAM)1, (LPARAM)temp); } return TRUE;
9. 프로퍼티 시트 – int Property. Sheet( LPCPROPSHEETHEADER lppsph ); • 프로퍼티 시트를 만든다. typedef struct _PROPSHEETPAGE { DWORD dw. Size; DWORD dw. Flags; HINSTANCE h. Instance; union { LPCSTR psz. Template; LPCDLGTEMPLATE p. Resource; }; union { HICON h. Icon; LPCSTR psz. Icon; }; LPCSTR psz. Title; DLGPROC pfn. Dlg. Proc; LPARAM l. Param; LPFNPSPCALLBACK pfn. Callback; UINT * pc. Ref. Parent; #if (_WIN 32_IE >= 0 x 0500) LPCTSTR psz. Header. Title; LPCTSTR psz. Header. Sub. Title; #endif #if (_WIN 32_WINNT >= 0 x 0501) HANDLE h. Act. Ctx; #endif } PROPSHEETPAGE, *LPPROPSHEETPAGE;
9. 프로퍼티 시트 – 시트 구조체 • PROPSHEETPAGE 구조체는 프로퍼티 시트에 포함된 개별 페이지에 대한 구조체이다. typedef struct _PROPSHEETHEADER { DWORD dw. Size; DWORD dw. Flags; HWND hwnd. Parent; HINSTANCE h. Instance; union { HICON h. Icon; LPCTSTR psz. Icon; }; LPCTSTR psz. Caption; UINT n. Pages; union { UINT n. Start. Page; LPCTSTR p. Start. Page; }; union { LPCPROPSHEETPAGE ppsp; HPROPSHEETPAGE *phpage; }; PFNPROPSHEETCALLBACK pfn. Callback; #if (_WIN 32_IE >= 0 x 0500) union { HBITMAP hbm. Watermark; LPCTSTR pszbm. Watermark; }; HPALETTE hpl. Watermark; union { HBITMAP hbm. Header; LPCSTR pszbm. Header; }; #endif } PROPSHEETHEADER, *LPPROPSHEETHEADER;
#include <windows. h> #include "resource. h" #include <commctrl. h> HINSTANCE h. Inst; BOOL CALLBACK Dlg. Proc (HWND h. Dlg, UINT message, WPARAM w. Param, LPARAM l. Param); int WINAPI Win. Main (HINSTANCE h. Instance, HINSTANCE h. Prev. Instance, PSTR sz. Cmd. Line, int i. Cmd. Show) { h. Inst = h. Instance; Dialog. Box(h. Instance, MAKEINTRESOURCE(IDD_DIALOG 1), NULL, Dlg. Proc); return 0; } BOOL CALLBACK Dialog. Proc 1 (HWND h. Dlg, UINT message, WPARAM w. Param, LPARAM l. Param); BOOL CALLBACK Dialog. Proc 2 (HWND h. Dlg, UINT message, WPARAM w. Param, LPARAM l. Param); BOOL CALLBACK Dlg. Proc (HWND h. Dlg, UINT message, WPARAM w. Param, LPARAM l. Param) { switch (message) { case WM_INITDIALOG : return TRUE ; case WM_COMMAND : switch (LOWORD (w. Param)) { case IDC_BUTTON 1: { PROPSHEETPAGE psp[2]; PROPSHEETHEADER psh; psp[0]. dw. Size = sizeof(PROPSHEETPAGE); psp[0]. dw. Flags = PSP_DEFAULT; psp[0]. h. Instance = h. Inst; psp[0]. psz. Template = MAKEINTRESOURCE(IDD_DIALOG 2); psp[0]. pfn. Dlg. Proc=(DLGPROC)Dialog. Proc 1; psp[0]. l. Param = 0; psp[1]. dw. Size = sizeof(PROPSHEETPAGE); psp[1]. dw. Flags = PSP_DEFAULT; psp[1]. h. Instance = h. Inst; psp[1]. psz. Template = MAKEINTRESOURCE(IDD_DIALOG 3); psp[1]. pfn. Dlg. Proc=(DLGPROC)Dialog. Proc 2; psp[1]. l. Param = 0;
psh. dw. Size = sizeof(PROPSHEETHEADER); psh. dw. Flags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW; psh. hwnd. Parent = h. Dlg; psh. psz. Caption = "프로퍼티 페이지"; psh. n. Pages = 2; psh. n. Start. Page = 0; psh. ppsp = psp; Property. Sheet(&psh); } return TRUE; case IDOK : case IDCANCEL : End. Dialog (h. Dlg, 0) ; return TRUE ; } break ; } return FALSE ; } BOOL CALLBACK Dialog. Proc 1 (HWND h. Dlg, UINT message, WPARAM w. Param, LPARAM l. Param) { return FALSE ; } BOOL CALLBACK Dialog. Proc 2 (HWND h. Dlg, UINT message, WPARAM w. Param, LPARAM l. Param) { return FALSE ; }
10. 이미지 리스트 – BOOL Image. List_Set. Overlay. Image( HIMAGELIST himl, int i. Image, int i. Overlay); • image 번째의 이미지를 i. Overlay 번째의 오버레이 이미지로 지정한 다. HIMAGELIST IL = Image. List_Load. Bitmap(g_h. Inst, MAKEINTRESOURCE(IDB_BITMAP 1), 32, 1, RGB(0, 0, 255)); Image. List_Set. Overlay. Image(IL, 1, 1); Image. List_Draw(IL, 0, hdc, 50, 50, ILD_NORMAL|INDEXTOOVERLAYMASK(1));
LRESULT CALLBACK Wnd. Proc (HWND hwnd, UINT message, WPARAM w. Param, LPARAM l. Param) { HDC hdc; PAINTSTRUCT ps ; RECT rect ; static HINSTANCE h. Inst; static HIMAGELIST IL; switch (message) { case WM_CREATE: h. Inst = ((LPCREATESTRUCT)l. Param)->h. Instance; IL = Image. List_Load. Bitmap(h. Inst, MAKEINTRESOURCE(IDB_BITMAP 1), 16, 1, RGB(192, 192)); Image. List_Set. Overlay. Image(IL, 1, 1); return 0 ; case WM_LBUTTONDOWN: hdc = Get. DC(hwnd); Image. List_Draw(IL, 0, hdc, 50, ILD_NORMAL); Image. List_Draw(IL, 0, hdc, 100, ILD_NORMAL|INDEXTOOVERLAYMASK(1)); Release. DC(hwnd, hdc); return 0; case WM_PAINT: hdc = Begin. Paint (hwnd, &ps) ; Get. Client. Rect (hwnd, &rect) ; Draw. Text (hdc, "Hello, Windows 98!", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; End. Paint (hwnd, &ps) ; return 0 ; case WM_DESTROY: Post. Quit. Message (0) ; return 0 ; } return Def. Window. Proc (hwnd, message, w. Param, l. Param) ; }
BOOL CALLBACK Dlg. Proc (HWND h. Dlg, UINT message, WPARAM w. Param, LPARAM l. Param) { static HIMAGELIST h. IL; static HWND h. List. View; switch (message) { case WM_INITDIALOG : { h. IL = Image. List_Load. Bitmap(h. Inst, MAKEINTRESOURCE(IDB_BITMAP 1), 16, 1, RGB(192, 192)); h. List. View = Get. Dlg. Item(h. Dlg, IDC_LIST 1); Send. Message(h. List. View, LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL, (LPARAM)h. IL); Send. Message(h. List. View, LVM_SETIMAGELIST, (WPARAM)LVSIL_NORMAL, (LPARAM)h. IL); LVCOLUMN col; col. mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; col. fmt = LVCFMT_LEFT; col. cx = 100; col. psz. Text = "이름"; col. i. Sub. Item = 0; Send. Message(h. List. View, LVM_INSERTCOLUMN, 0, (LPARAM)&col); col. mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; col. fmt = LVCFMT_LEFT; col. cx = 100; col. psz. Text = "주소"; col. i. Sub. Item = 1; Send. Message(h. List. View, LVM_INSERTCOLUMN, 1, (LPARAM)&col); col. mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; col. fmt = LVCFMT_LEFT; col. cx = 100; col. psz. Text = "전화번호"; col. i. Sub. Item = 2; Send. Message(h. List. View, LVM_INSERTCOLUMN, 2, (LPARAM)&col); LVITEM li; li. mask = LVIF_TEXT | LVIF_IMAGE; li. state = 0; li. state. Mask = 0;
li. i. Image = 0; li. i. Sub. Item = 0; li. i. Item = 0; li. psz. Text = "홍길동"; Send. Message(h. List. View, LVM_INSERTITEM, 0 , (LPARAM)&li); li. i. Sub. Item = 1; li. psz. Text = "서울"; Send. Message(h. List. View, LVM_SETITEM, 0 , (LPARAM)&li); li. i. Sub. Item = 2; li. psz. Text = "123 -1234"; Send. Message(h. List. View, LVM_SETITEM, 0 , (LPARAM)&li); li. i. Image = 1; li. i. Sub. Item = 0; li. i. Item = 1; li. psz. Text = "김길동"; Send. Message(h. List. View, LVM_INSERTITEM, 0 , (LPARAM)&li); li. i. Sub. Item = 1; li. psz. Text = "강원도"; Send. Message(h. List. View, LVM_SETITEM, 0 , (LPARAM)&li); li. i. Sub. Item = 2; li. psz. Text = "234 -2345"; Send. Message(h. List. View, LVM_SETITEM, 0 , (LPARAM)&li); } return TRUE ; case WM_COMMAND : switch (LOWORD (w. Param)) { case IDOK : case IDCANCEL : End. Dialog (h. Dlg, 0) ; return TRUE ; } break ; } return FALSE ; }
11. 리스트 뷰 typedef struct _LVCOLUMN { UINT mask; int fmt; int cx; LPTSTR psz. Text; int cch. Text. Max; int i. Sub. Item; #if (_WIN 32_IE >= 0 x 0300) int i. Image; int i. Order; #endif } LVCOLUMN, *LPLVCOLUMN; LVCF_FMT fmt 멤버에 있는 값을 사용한다. LVCF_SUBITEM i. Sub. Item 멤버에 있는 값을 사용한다. LVCF_TEXT psz. Text 멤버에 있는 값을 사용한다. LVCF_WIDTH cx 멤버에 있는 값을 사용한다. LVCF_IMAGE image 멤버에 있는 값을 사용한다. LVCF_ORDER i. Order 멤버에 있는 값을 사용한다.
11. 리스트 뷰 • 선택 항목 조사 – 리스트 뷰는 항목에 변경이 발생하기 전에 LVN_ITEMCHANGING 통지 메시지를 보내주고 변경이 발생한 후에 LVN_ITEMCHANGED 통지 메시지를 보내준다. – 이 두 메시지의 l. Para에는 어떠한 변경이 발생했는지에 대한 정보 인 NMLISTVIEW 구조체의 포인터가 전달된다. typedef struct tag. NMLISTVIEW { NMHDR hdr; int i. Item; int i. Sub. Item; UINT u. New. State; UINT u. Old. State; UINT u. Changed; POINT pt. Action; LPARAM l. Param; } NMLISTVIEW, *LPNMLISTVIEW;
typedef struct tag. NMHDR { HWND hwnd. From; UINT id. From; UINT code; } NMHDR;
case WM_NOTIFY: { LPNMHDR LPNMLISTVIEW nlv; hdr = (LPNMHDR)l. Param; nlv = (LPNMLISTVIEW)l. Param; hdr; if (hdr->hwnd. From == h. List. View) { switch(hdr->code) { case LVN_ITEMCHANGED: if(nlv->u. Changed == LVIF_STATE && nlv->u. New. State == (LVIS_SELECTED|LVIS_FOCUSED)) { char sz. Name[255]; char sz. Addr[255]; char sz. Tel. No[255]; List. View_Get. Item. Text(h. List. View, nlv->i. Item, 0, sz. Name, 255); List. View_Get. Item. Text(h. List. View, nlv->i. Item, 1, sz. Addr, 255); List. View_Get. Item. Text(h. List. View, nlv->i. Item, 2, sz. Tel. No, 255); char temp[256]; wsprintf(temp, "이름 : %s, 주소 : %s, 전화번호 : %s", sz. Name, sz. Addr, sz. Tel. No); Message. Box(h. Dlg, temp, "", MB_OK); } }
case WM_NOTIFY: { LPNMHDR hdr; LPNMLISTVIEW nlv; hdr = (LPNMHDR)l. Param; nlv = (LPNMLISTVIEW)l. Param; if (hdr->hwnd. From == h. List. View) { switch(hdr->code) { case NM_DBLCLK: { LPNMITEMACTIVATE lpnmitem = (LPNMITEMACTIVATE) l. Param; if (nlv->i. Item != -1) { char temp[256]; List. View_Get. Item. Text(h. List. View, lpnmitem->i. Item, lpnmitem->i. Sub. Item, temp, 256); Message. Box(NULL, temp, "", MB_OK); } } }
12. 트리 뷰 – TVINSERTSTRUCT typedef struct tag. TVINSERTSTRUCT { HTREEITEM h. Parent; HTREEITEM h. Insert. After; #if (_WIN 32_IE >= 0 x 0400) union { TVITEMEX itemex; TVITEM item; } DUMMYUNIONNAME; #else TVITEM item; #endif } TVINSERTSTRUCT, *LPTVINSERTSTRUCT;
12. 트리 뷰 – TVITEM typedef struct tag. TVITEM { UINT mask; HTREEITEM h. Item; UINT state. Mask; LPTSTR psz. Text; int cch. Text. Max; int i. Image; int i. Selected. Image; int c. Children; LPARAM l. Param; } TVITEM, *LPTVITEM; – mask : • TVIF_CHILDREN : c. Children 멤버 • TVIF_HANDLE : h. Item 멤버 • TVIF_IMAGE : i. Image 멤버
BOOL CALLBACK Dlg. Proc (HWND h. Dlg, UINT message, WPARAM w. Param, LPARAM l. Param) { static HIMAGELIST h. IL; static HWND h. Tree. View; switch (message) { case WM_INITDIALOG : { h. IL = Image. List_Load. Bitmap(h. Inst, MAKEINTRESOURCE(IDB_BITMAP 1), 16, 1, RGB(192, 192)); h. Tree. View = Get. Dlg. Item(h. Dlg, IDC_TREE 1); Send. Message(h. Tree. View, TVM_SETIMAGELIST, (WPARAM)TVSIL_NORMAL, (LPARAM)h. IL); TVINSERTSTRUCT tvi; tvi. h. Parent = 0; tvi. item. mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvi. item. i. Image = 0; tvi. item. i. Selected. Image = 4; tvi. item. psz. Text = "친구"; HTREEITEM h. Root = (HTREEITEM)Send. Message(h. Tree. View, TVM_INSERTITEM, 0, (LPARAM)&tvi); tvi. h. Parent = h. Root; tvi. item. mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvi. item. i. Image = 0; tvi. item. i. Selected. Image = 4; tvi. item. psz. Text = "홍길동"; Send. Message(h. Tree. View, TVM_INSERTITEM, 0, (LPARAM)&tvi); tvi. h. Parent = h. Root; tvi. item. mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvi. item. i. Image = 0; tvi. item. i. Selected. Image = 4; tvi. item. psz. Text = "김길동"; Send. Message(h. Tree. View, TVM_INSERTITEM, 0, (LPARAM)&tvi); } return TRUE ;
case WM_NOTIFY: { } case WM_COMMAND : switch (LOWORD (w. Param)) { case IDOK : case IDCANCEL : Image. List_Destroy(h. IL); End. Dialog (h. Dlg, 0) ; return TRUE ; } break ; } return FALSE ; }
12. 트리 뷰 • 선택 – 트리 뷰는 사용자가 다른 항목을 선택하면 항목이 바뀌기 전에 TVN_SELCHANGING을 항목이 바뀐 후에 TVN_SELCHANGED 통 지 메시지를 보내준다. – TVN_SELCHANGED메시지를 받았을 때 사용자가 선택한 항목을 조사하여 특정 처리를 수행하면 된다. – 이 메시지는 l. Param으로 NMLISTVIEW구조체를 보내준다. typedef struct tag. NMLISTVIEW { NMHDR hdr; int i. Item; int i. Sub. Item; UINT u. New. State; UINT u. Old. State; UINT u. Changed; POINT pt. Action; LPARAM l. Param; } NMLISTVIEW, *LPNMLISTVIEW;
12. 트리 뷰 case WM_NOTIFY: { LPNMHDR hdr; LPNMTREEVIEW ntv; hdr = (LPNMHDR)l. Param; ntv = (LPNMTREEVIEW)l. Param; TVITEMEX Tv. Ex; char temp[256]; if (hdr->hwnd. From == h. Tree. View) { switch(hdr->code) { case TVN_SELCHANGED: Tv. Ex. mask = TVIF_IMAGE | TVIF_TEXT; Tv. Ex. h. Item = ntv->item. New. h. Item; Tv. Ex. psz. Text = temp; Tv. Ex. cch. Text. Max = 256; Tree. View_Get. Item(h. Tree. View, &Tv. Ex); Message. Box(h. Dlg, temp, "", MB_OK); } } }
case WM_NOTIFY: { LPNMHDR hdr; LPNMTREEVIEW ntv; hdr = (LPNMHDR)l. Param; ntv = (LPNMTREEVIEW)l. Param; TVITEMEX Tv. Ex; char temp[256]; if (hdr->hwnd. From == h. Tree. View) { switch(hdr->code) { case NM_DBLCLK: HTREEITEM h. Item = Tree. View_Get. Selection(h. Tree. View); if (h. Item == NULL) { Message. Box(h. Dlg, "선택된 항목이 없습니다. ", NULL, MB_OK); } else { Tv. Ex. mask = TVIF_TEXT; Tv. Ex. psz. Text = temp; Tv. Ex. cch. Text. Max = 256; Tv. Ex. h. Item = h. Item; Tree. View_Get. Item(h. Tree. View, &Tv. Ex); Message. Box(h. Dlg, temp, "", MB_OK); } }
12. 트리 뷰 – 임의의 시점에 어떤 항목을 조사 • HTREEITEM Tree. View_Get. Selection(HWND hwnd. TV); – 특정항목을 강제로 선택 • BOOL Tree. View_Select(HWND hwnd. TV, HTREEITEM hitem, UINT flag);
- Slides: 64