You are on page 1of 12

//Client.cpp #include <Windows.h> #include <CommCtrl.

h> #include <vector> using namespace std; //Define c|c gi| tr hng #define LISTVIEW_WIDTH #define LISTVIEW_HEIGHT #define MAX_LEN #define PUSHBUTTON_WIDTH #define PUSHBUTTON_HEIGHT #define EDIT_CONTROL_WIDTH #define EDIT_CONTROL_HEIGHT #define STATIC_WIDTH #define STATIC_HEIGHT #define #define #define #define #define #define #define #define #define IDC_INSERT_ITEM IDC_DELETE_ITEM IDC_CLEAR_DATA IDC_DAY IDC_MONTH IDC_YEAR IDC_EXIT GIOITINH_NAM TRUE GIOITINH_NU

500 400 100 100 30 150 20 100 20 100 101 102 103 104 105 106 FALSE

struct ListViewItem { TCHAR lpszHoTen[MAX_LEN]; BOOL bGioiTinh; TCHAR lpszNgayThangNamSinh[MAX_LEN]; }; HWND hListView,hHoTen,hMonth,hDay,hYear,hGioiTinh_Nam,hGioiTinh_Nu; HINSTANCE hInst; vector<ListViewItem>v_ItemList; LRESULT CALLBACK WndProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); //C|c h{m lin quan n listview HWND doCreateListView(HWND hParent); bool doInsertItem2ListView(HWND hListView,ListViewItem MyItem); void doReLoadListViewControl(HWND hListView); //C|c h{m lin quan n Control kh|c HWND doCreateButton(DWORD BtnStyle,HWND hParent,TCHAR* lpszBtnLabel,int x,int y,int nWidth,int nHeight,int BtnID); HWND doCreateEditControl(HWND hParent,int x,int y,int EditID,bool NumberOnly); void doCreateStaticControl(HWND hParent,int x,int y,TCHAR* lpszLabel); HWND doCreateCombo(HWND hParent,int x,int y,int nWidth,int nHeight,int nID); void doInsertMonth(HWND hCombo); void doInsertDay(HWND hCombo,int nMonth); void doInsertYear(HWND hCombo,int nYearMax); HMENU doCreateMenu(); //C|c h{m lin quan n x l d liu bool doAddNewRecord(ListViewItem NewItem,HWND hListView); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) { TCHAR lpszAppName[] = TEXT("Mix for Pratice"); MSG Msg; WNDCLASS ClientApp; ClientApp.cbClsExtra = 0; ClientApp.cbWndExtra = 0; ClientApp.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); ClientApp.hCursor = LoadCursor(NULL,IDC_ARROW); ClientApp.hIcon = LoadIcon(NULL,IDI_WINLOGO); ClientApp.hInstance = hInstance; ClientApp.lpfnWndProc = (WNDPROC)WndProc; ClientApp.lpszClassName = lpszAppName; ClientApp.lpszMenuName = NULL; ClientApp.style = CS_HREDRAW | CS_VREDRAW; //ng k lp ca s if (!RegisterClass(&ClientApp)) { MessageBox(NULL,TEXT("Khng ng k c Window Class !"),TEXT("ERROR"),MB_OK | MB_ICONERROR); return 0; } /*ListViewItem lvItemTemp; wsprintf(lvItemTemp.lpszTenBien,TEXT("Bin 1")); lvItemTemp.iGiaTri = 10; wsprintf(lvItemTemp.lpszGhiChu,TEXT("}y l{ ta X")); v_ItemList.push_back(lvItemTemp); wsprintf(lvItemTemp.lpszTenBien,TEXT("Bin 2")); lvItemTemp.iGiaTri = -4; wsprintf(lvItemTemp.lpszGhiChu,TEXT("}y l{ ta Y")); v_ItemList.push_back(lvItemTemp); wsprintf(lvItemTemp.lpszTenBien,TEXT("Bin 3")); lvItemTemp.iGiaTri = 0; wsprintf(lvItemTemp.lpszGhiChu,TEXT("}y l{ ta Z")); v_ItemList.push_back(lvItemTemp);*/ hInst = hInstance; HWND hWnd = CreateWindow(lpszAppName, TEXT("Application for testing"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, //Window Stype //Ta X //Ta Y //Chiu rng //Chiu cao //Handle ca s cha

NULL, hInstance, NULL ); if (!hWnd) { MessageBox(NULL,TEXT("Khng to c ca s"),TEXT("ERROR"),MB_OK | MB_ICONERROR); return 0; } ShowWindow(hWnd,nShowCmd); UpdateWindow(hWnd); //Message loop while (GetMessage(&Msg,NULL,0,0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam) { HDC hdc; int XClient,YClient; TCHAR lpszBuffer[100]; int wmId,wmEvent; switch(Msg) { case WM_COMMAND: { wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); switch (wmId) { case IDC_INSERT_ITEM: { if (wmEvent == BN_CLICKED) { ListViewItem LvItem; TCHAR lpszTemp[MAX_LEN]; GetWindowText(hHoTen,LvItem.lpszHoTen,MAX_LEN);

//Menu //lpParam

if (wcslen(LvItem.lpszHoTen) == 0) { MessageBox(NULL,TEXT("H tn khng c b trng"),TEXT("Thng b|o"),MB_OK | MB_ICONWARNING); return 0; } if (SendMessage(hGioiTinh_Nam,BM_GETCHECK,0,0) == BST_CHECKED) LvItem.bGioiTinh = GIOITINH_NAM; else if (SendMessage(hGioiTinh_Nu,BM_GETCHECK,0,0) == BST_CHECKED) LvItem.bGioiTinh = GIOITINH_NU; int iCurrentSel; iCurrentSel = SendMessage(hDay,CB_GETCURSEL,0,0); if (iCurrentSel == CB_ERR) { MessageBox(NULL,TEXT("Ng{y th|ng nm sinh khng hp l"),TEXT("Thng b|o"),MB_ICONWARNING | MB_OK); return 0; } else SendMessage(hDay,CB_GETLBTEXT,iCurrentSel,(LPARAM)lpszTemp); wsprintf(LvItem.lpszNgayThangNamSinh,TEXT("%s/"),lpszTemp); iCurrentSel = SendMessage(hMonth,CB_GETCURSEL,0,0); if (iCurrentSel == CB_ERR) { MessageBox(NULL,TEXT("Ng{y th|ng nm sinh khng hp l"),TEXT("Thng b|o"),MB_ICONWARNING | MB_OK); return 0; } else SendMessage(hMonth,CB_GETLBTEXT,iCurrentSel,(LPARAM)lpszTemp); wcscat(LvItem.lpszNgayThangNamSinh,lpszTemp); wcscat(LvItem.lpszNgayThangNamSinh,TEXT("/")); iCurrentSel = SendMessage(hYear,CB_GETCURSEL,0,0); if (iCurrentSel == CB_ERR) { MessageBox(NULL,TEXT("Ng{y th|ng nm sinh khng hp l"),TEXT("Thng b|o"),MB_ICONWARNING | MB_OK); return 0; } else SendMessage(hYear,CB_GETLBTEXT,iCurrentSel,(LPARAM)lpszTemp); wcscat(LvItem.lpszNgayThangNamSinh,lpszTemp); bool Result = doAddNewRecord(LvItem,hListView); if (Result) { MessageBox(NULL,TEXT("~ thm d liu th{nh cng !"),TEXT("Thm d liu"),MB_OK | MB_ICONINFORMATION); SetWindowText(hHoTen,TEXT("")); } else MessageBox(NULL,TEXT("Thm d liu mi tht bi"),TEXT("Thm d liu"),MB_OK | MB_ICONERROR);

} break; } case IDC_DELETE_ITEM: { if (wmEvent == BN_CLICKED) { int SelectedItem = ListView_GetSelectionMark(hListView); if (SelectedItem >= 0) { TCHAR lpszBuffer[MAX_LEN]; TCHAR lpszMessage[MAX_LEN + 200]; ListView_GetItemText(hListView,SelectedItem,0,lpszBuffer,MAX_LEN); wsprintf(lpszMessage,TEXT("%s %s"),TEXT("Bn tht s mun xa sinh vin n{y ? "),lpszBuffer); if (MessageBox(NULL,lpszMessage,TEXT("X|c nhn"),MB_YESNO | MB_ICONINFORMATION) == IDYES) { ListView_DeleteItem(hListView,SelectedItem); } } else MessageBox(NULL,TEXT("H~y chn 1 item bn mun xa !"),TEXT("Xa Item"),MB_OK | MB_ICONWARNING); } } break; case IDC_MONTH: { if (wmEvent == CBN_SELCHANGE) { int iCurrentSel = SendMessage(hMonth,CB_GETCURSEL,0,0); TCHAR lpszBuffer[5]; if (iCurrentSel != CB_ERR) { SendMessage(hMonth,CB_GETLBTEXT,iCurrentSel,(LPARAM)lpszBuffer); doInsertDay(hDay,_wtoi(lpszBuffer)); } } break; } case IDC_EXIT: SendMessage(hWnd,WM_CLOSE,0,0); break; } break; } case WM_CREATE: { RECT ClientRect; GetClientRect(hWnd,&ClientRect); hListView = doCreateListView(hWnd); doReLoadListViewControl(hListView); doCreateStaticControl(hWnd,ClientRect.left + 10,ClientRect.top + 50,TEXT("H Tn : ")); hHoTen = doCreateEditControl(hWnd,ClientRect.left + 10 + STATIC_WIDTH + 5,ClientRect.top + 50,0,FALSE); doCreateStaticControl(hWnd,ClientRect.left + 10,ClientRect.top + 50 + STATIC_HEIGHT + 5,TEXT("Gii Tnh : ")); hGioiTinh_Nam = doCreateButton(BS_AUTORADIOBUTTON,hWnd,TEXT("Nam"),ClientRect.left + 10 + STATIC_WIDTH + 5,ClientRect.top + 50 + STATIC_HEIGHT,PUSHBUTTON_WIDTH/2,PUSHBUTTON_HEIGHT,0); hGioiTinh_Nu = doCreateButton(BS_AUTORADIOBUTTON,hWnd,TEXT("Nu"),ClientRect.left + 10 + 3*STATIC_WIDTH/2 + 5,ClientRect.top + 50 + STATIC_HEIGHT,PUSHBUTTON_WIDTH/2,PUSHBUTTON_HEIGHT,0); SendMessage(hGioiTinh_Nam,BM_SETCHECK,BST_CHECKED,0); doCreateStaticControl(hWnd,ClientRect.left + 10,ClientRect.top + 50 + 2*STATIC_HEIGHT + 2*5,TEXT("Ng{y Sinh : ")); hMonth = doCreateCombo(hWnd,ClientRect.left + 10 + STATIC_WIDTH,ClientRect.top + 50 + 2*STATIC_HEIGHT + 2*5,40,100,IDC_MONTH); hDay = doCreateCombo(hWnd,ClientRect.left + 10 + STATIC_WIDTH + 45,ClientRect.top + 50 + 2*STATIC_HEIGHT + 2*5,40,100,IDC_DAY); hYear = doCreateCombo(hWnd,ClientRect.left + 10 + STATIC_WIDTH + 90,ClientRect.top + 50 + 2*STATIC_HEIGHT + 2*5,100,100,IDC_YEAR); doInsertMonth(hMonth); doInsertYear(hYear,2010);

doCreateButton(BS_PUSHBUTTON | BS_VCENTER | BS_CENTER,hWnd,TEXT("Thm"), ClientRect.left + 15 + STATIC_WIDTH + EDIT_CONTROL_WIDTH + 20, ClientRect.top + 50 + STATIC_HEIGHT, PUSHBUTTON_WIDTH,PUSHBUTTON_HEIGHT,IDC_INSERT_ITEM); doCreateButton(BS_PUSHBUTTON | BS_VCENTER | BS_CENTER,hWnd,TEXT("Xa Item"),ClientRect.right - LISTVIEW_WIDTH + 50, ClientRect.top + LISTVIEW_HEIGHT + 20,PUSHBUTTON_WIDTH,PUSHBUTTON_HEIGHT,IDC_DELETE_ITEM); //To Menu bar HMENU hMenu = doCreateMenu(); SetMenu(hWnd,hMenu); break; } case WM_PAINT: PAINTSTRUCT ps; hdc = BeginPaint(hWnd,&ps); EndPaint(hWnd,&ps); break; case WM_CLOSE: case WM_DESTROY: PostQuitMessage(0); break; case WM_SIZE: XClient = LOWORD(lParam);

YClient = HIWORD(lParam); wsprintf(lpszBuffer,TEXT("X : %d - Y : %d"),XClient,YClient); SetWindowText(hWnd,lpszBuffer); break; case WM_MOUSEMOVE: POINT CursorPos; GetCursorPos(&CursorPos); break; case WM_LBUTTONDOWN: GetWindowText(hWnd,lpszBuffer,100); break; case WM_NOTIFY: LPNMHDR NotifyInfo = (LPNMHDR)lParam; switch (NotifyInfo->code) { case NM_DBLCLK: case NM_RETURN: { if (NotifyInfo->hwndFrom == hListView) { // int Index = ListView_GetSelectionMark(hListView); } } } break; } return DefWindowProc(hWnd,Msg,wParam,lParam); } HWND doCreateListView(HWND hParent) { HWND hListView; RECT ClientRect; LVCOLUMN LvCol; InitCommonControls(); GetClientRect(hParent,&ClientRect); hListView = CreateWindow(TEXT("SysListView32"),NULL,WS_CHILD | WS_VISIBLE | WS_BORDER | LVS_REPORT | LVS_ALIGNTOP | LVS_SHOWSELALWAYS, ClientRect.right - LISTVIEW_WIDTH - 5,ClientRect.top + 5,LISTVIEW_WIDTH,LISTVIEW_HEIGHT,hParent,NULL,hInst,0); if (!hListView) { MessageBox(NULL,TEXT("Khng th to ListView "),TEXT("ERROR"),MB_OK | MB_ICONERROR); return NULL; } //Thm column v{o listview LvCol.mask = LVCF_TEXT | LVCF_WIDTH; LvCol.cx = 200; LvCol.pszText = TEXT("H Tn"); ListView_InsertColumn(hListView,1,&LvCol); LvCol.pszText = TEXT("Ng{y Th|ng Nm Sinh"); ListView_InsertColumn(hListView,2,&LvCol); LvCol.pszText = TEXT("Gii Tnh"); LvCol.cx = 100; ListView_InsertColumn(hListView,3,&LvCol); ListView_SetExtendedListViewStyle(hListView,LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); return hListView; } bool doInsertItem2ListView(HWND hListView,ListViewItem MyItem) { int iItemCount = ListView_GetItemCount(hListView); LVITEM LvItem; TCHAR lpszBuffer[10]; LvItem.mask = LVIF_TEXT; LvItem.pszText = MyItem.lpszHoTen; LvItem.iItem = iItemCount; LvItem.iSubItem = 0; int Index = ListView_InsertItem(hListView,&LvItem); if (Index == -1) return false; if (MyItem.bGioiTinh == GIOITINH_NAM) wsprintf(lpszBuffer,TEXT("Nam")); else wsprintf(lpszBuffer,TEXT("N")); ListView_SetItemText(hListView,Index,1,lpszBuffer); ListView_SetItemText(hListView,Index,2,MyItem.lpszNgayThangNamSinh) return true; } void doReLoadListViewControl(HWND hListView) { ListView_DeleteAllItems(hListView); for (unsigned int i = 0; i < v_ItemList.size(); i++) doInsertItem2ListView(hListView,v_ItemList[i]); } HWND doCreateButton(DWORD BtnStyle,HWND hParent,TCHAR* lpszBtnLabel,int x,int y,int nWidth,int nHeight,int BtnID) { HWND hBtn; hBtn = CreateWindow(TEXT("BUTTON"),lpszBtnLabel,WS_CHILD | WS_VISIBLE | BtnStyle,x,y,nWidth,nHeight,hParent,(HMENU)BtnID,hInst,0); if (!hBtn) return NULL; return hBtn;

} HWND doCreateEditControl(HWND hParent,int x,int y,int EditID,bool NumberOnly) { HWND hEdit; DWORD dwStyle = WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_BORDER; if (NumberOnly) dwStyle = dwStyle | ES_NUMBER; hEdit = CreateWindow(TEXT("EDIT"),TEXT(""),dwStyle,x,y,EDIT_CONTROL_WIDTH,EDIT_CONTROL_HEIGHT,hParent,(HMENU)EditID,hInst,0);

return hEdit; } void doCreateStaticControl(HWND hParent,int x,int y,TCHAR* lpszLabel) { CreateWindow(TEXT("STATIC"),lpszLabel,WS_CHILD | WS_VISIBLE | SS_CENTER, x,y,STATIC_WIDTH,STATIC_HEIGHT,hParent,NULL,hInst,0); } bool doAddNewRecord(ListViewItem NewItem,HWND hListView) { v_ItemList.push_back(NewItem); return doInsertItem2ListView(hListView,NewItem); } HWND doCreateCombo(HWND hParent,int x,int y,int nWidth,int nHeight,int nID) { HWND hCombo = CreateWindow(TEXT("ComboBox"),TEXT(""),WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_TABSTOP,x,y,nWidth,nHeight,hParent,(HMENU)nID,hInst,0); return hCombo; } void doInsertMonth(HWND hCombo) { TCHAR lpszMonth[5]; for (int i = 1 ; i <= 12; i++) { wsprintf(lpszMonth,TEXT("%d"),i); SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)lpszMonth); } } void doInsertDay(HWND hCombo,int nMonth) { SendMessage(hCombo,CB_RESETCONTENT,0,0); int Day = 0; TCHAR lpszBuffer[5]; if (nMonth == 2) Day = 29; else if (nMonth == 1 || nMonth == 3 || nMonth == 5 || nMonth == 7 || nMonth == 8 || nMonth == 10 || nMonth ==12) Day = 31; else Day = 30; for (int i = 0 ; i < Day; i++) { wsprintf(lpszBuffer,TEXT("%d"),i+1); SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)lpszBuffer); } } void doInsertYear(HWND hCombo,int nYearMax) { TCHAR lpszBuffer[6]; for (int i = nYearMax - 100; i <= nYearMax;i++) { wsprintf(lpszBuffer,TEXT("%d"),i); SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)lpszBuffer); } } HMENU doCreateMenu() { HMENU hPopUpMenu,hMainMenu; hPopUpMenu = CreateMenu(); hMainMenu = CreateMenu(); AppendMenu(hPopUpMenu,MF_STRING,IDC_INSERT_ITEM,TEXT("&Thm sinh vin")); AppendMenu(hPopUpMenu,MF_STRING,IDC_DELETE_ITEM,TEXT("&Xa sinh vin")); AppendMenu(hPopUpMenu,MF_SEPARATOR,NULL,NULL); AppendMenu(hPopUpMenu,MF_STRING,IDC_EXIT,TEXT("&Close")); AppendMenu(hMainMenu,MF_POPUP,(UINT_PTR)hPopUpMenu,TEXT("Thao t|c")); return hMainMenu; } //------------------------------------------------------------------------------//Sysmets3.cpp #define WINVER 0x0500 #include <windows.h> #include "sysmets.h" LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("SysMets3") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style wndclass.lpfnWndProc = CS_HREDRAW | CS_VREDRAW ; = WndProc ;

wndclass.cbClsExtra wndclass.cbWndExtra wndclass.hInstance wndclass.hIcon wndclass.hCursor wndclass.hbrBackground wndclass.lpszMenuName wndclass.lpszClassName

= = = = = = = =

0 ; 0 ; hInstance ; LoadIcon (NULL, IDI_APPLICATION) ; LoadCursor (NULL, IDC_ARROW) ; (HBRUSH) GetStockObject (WHITE_BRUSH) ; NULL ; szAppName ;

if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("Program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, TEXT ("Get System Metrics No. 3"), WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK { static int HDC int PAINTSTRUCT SCROLLINFO TCHAR TEXTMETRIC WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) cxChar, cxCaps, cyChar, cxClient, cyClient, iMaxWidth ; hdc ; i, x, y, iVertPos, iHorzPos, iPaintBeg, iPaintEnd ; ps ; si ; szBuffer[10] ; tm ;

switch (message) { case WM_CREATE: hdc = GetDC (hwnd) ; GetTextMetrics (hdc, &tm) ; cxChar = tm.tmAveCharWidth ; cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ; cyChar = tm.tmHeight + tm.tmExternalLeading ; ReleaseDC (hwnd, hdc) ;

iMaxWidth = 40 * cxChar + 22 * cxCaps ; return 0 ; case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ;

si.cbSize = sizeof (si) ; si.fMask = SIF_RANGE | SIF_PAGE ; si.nMin = 0 ; si.nMax = NUMLINES - 1 ; si.nPage = cyClient / cyChar ; SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ; si.cbSize = sizeof (si) ; si.fMask = SIF_RANGE | SIF_PAGE ; si.nMin = 0 ; si.nMax = 2 + iMaxWidth / cxChar ; si.nPage = cxClient / cxChar ; SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ; return 0 ; case WM_VSCROLL: si.cbSize = sizeof (si) ; si.fMask = SIF_ALL ; GetScrollInfo (hwnd, SB_VERT, &si) ; iVertPos = si.nPos ; switch (LOWORD (wParam)) { case SB_TOP: si.nPos = si.nMin ; break ; case SB_BOTTOM: si.nPos = si.nMax ; break ; case SB_LINEUP: si.nPos -= 1 ; break ; case SB_LINEDOWN: si.nPos += 1 ; break ; case SB_PAGEUP: si.nPos -= si.nPage ; break ;

case SB_PAGEDOWN: si.nPos += si.nPage ; break ; case SB_THUMBTRACK: si.nPos = si.nTrackPos ; break ; default: break ; } si.fMask = SIF_POS ; SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ; GetScrollInfo (hwnd, SB_VERT, &si) ;

if (si.nPos != iVertPos) { ScrollWindow (hwnd, 0, cyChar * (iVertPos - si.nPos), NULL, NULL) ; UpdateWindow (hwnd) ; } return 0 ; case WM_HSCROLL: si.cbSize = sizeof (si) ; si.fMask = SIF_ALL ; GetScrollInfo (hwnd, SB_HORZ, &si) ; iHorzPos = si.nPos ; switch (LOWORD (wParam)) { case SB_LINELEFT: si.nPos -= 1 ; break ; case SB_LINERIGHT: si.nPos += 1 ; break ; case SB_PAGELEFT: si.nPos -= si.nPage ; break ; case SB_PAGERIGHT: si.nPos += si.nPage ; break ; case SB_THUMBPOSITION: si.nPos = si.nTrackPos ; break ; default : break ; } si.fMask = SIF_POS ; SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ; GetScrollInfo (hwnd, SB_HORZ, &si) ;

if (si.nPos != iHorzPos) { ScrollWindow (hwnd, cxChar * (iHorzPos - si.nPos), 0, NULL, NULL) ; } return 0 ; case WM_PAINT : hdc = BeginPaint (hwnd, &ps) ;

si.cbSize = sizeof (si) ; si.fMask = SIF_POS ; GetScrollInfo (hwnd, SB_VERT, &si) ; iVertPos = si.nPos ;

GetScrollInfo (hwnd, SB_HORZ, &si) ; iHorzPos = si.nPos ; iPaintBeg = max (0, iVertPos + ps.rcPaint.top / cyChar) ; iPaintEnd = min (NUMLINES - 1, iVertPos + ps.rcPaint.bottom / cyChar) ; for (i = iPaintBeg ; i <= iPaintEnd ; i++) { x = cxChar * (1 - iHorzPos) ; y = cyChar * (i - iVertPos) ; TextOut (hdc, x, y, sysmetrics[i].szLabel, lstrlen (sysmetrics[i].szLabel)) ; TextOut (hdc, x + 22 * cxCaps, y, sysmetrics[i].szDesc, lstrlen (sysmetrics[i].szDesc)) ; SetTextAlign (hdc, TA_RIGHT | TA_TOP) ; TextOut (hdc, x + 22 * cxCaps + 40 * cxChar, y, szBuffer, wsprintf (szBuffer, TEXT ("%5d"), GetSystemMetrics (sysmetrics[i].iIndex))) ;

SetTextAlign (hdc, TA_LEFT | TA_TOP) ; } EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; } //////sysmet.h #define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0])) struct { int iIndex ; TCHAR * szLabel ; TCHAR * szDesc ; } sysmetrics [] = { SM_CXSCREEN, SM_CYSCREEN, SM_CXVSCROLL, SM_CYHSCROLL, SM_CYCAPTION, SM_CXBORDER, SM_CYBORDER, SM_CXFIXEDFRAME, SM_CYFIXEDFRAME, SM_CYVTHUMB, SM_CXHTHUMB, SM_CXICON, SM_CYICON, SM_CXCURSOR, SM_CYCURSOR, SM_CYMENU, SM_CXFULLSCREEN, SM_CYFULLSCREEN, SM_CYKANJIWINDOW, SM_MOUSEPRESENT, SM_CYVSCROLL, SM_CXHSCROLL, SM_DEBUG, SM_SWAPBUTTON, SM_CXMIN, SM_CYMIN, SM_CXSIZE, SM_CYSIZE, SM_CXSIZEFRAME, SM_CYSIZEFRAME, SM_CXMINTRACK, SM_CYMINTRACK, SM_CXDOUBLECLK, SM_CYDOUBLECLK, SM_CXICONSPACING, SM_CYICONSPACING, SM_MENUDROPALIGNMENT, SM_PENWINDOWS, SM_DBCSENABLED, SM_CMOUSEBUTTONS, SM_SECURE, SM_CXEDGE,

TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT

("SM_CXSCREEN"), ("Screen width in pixels"), ("SM_CYSCREEN"), ("Screen height in pixels"), ("SM_CXVSCROLL"), ("Vertical scroll width"), ("SM_CYHSCROLL"), ("Horizontal scroll height"), ("SM_CYCAPTION"), ("Caption bar height"), ("SM_CXBORDER"), ("Window border width"), ("SM_CYBORDER"), ("Window border height"), ("SM_CXFIXEDFRAME"), ("Dialog window frame width"), ("SM_CYFIXEDFRAME"), ("Dialog window frame height"), ("SM_CYVTHUMB"), ("Vertical scroll thumb height"), ("SM_CXHTHUMB"), ("Horizontal scroll thumb width"), ("SM_CXICON"), ("Icon width"), ("SM_CYICON"), ("Icon height"), ("SM_CXCURSOR"), ("Cursor width"), ("SM_CYCURSOR"), ("Cursor height"), ("SM_CYMENU"), ("Menu bar height"), ("SM_CXFULLSCREEN"), ("Full screen client area width"), ("SM_CYFULLSCREEN"), ("Full screen client area height"), ("SM_CYKANJIWINDOW"), ("Kanji window height"), ("SM_MOUSEPRESENT"), ("Mouse present flag"), ("SM_CYVSCROLL"), ("Vertical scroll arrow height"), ("SM_CXHSCROLL"), ("Horizontal scroll arrow width"), ("SM_DEBUG"), ("Debug version flag"), ("SM_SWAPBUTTON"), ("Mouse buttons swapped flag"), ("SM_CXMIN"), ("Minimum window width"), ("SM_CYMIN"), ("Minimum window height"), ("SM_CXSIZE"), ("Min/Max/Close button width"), ("SM_CYSIZE"), ("Min/Max/Close button height"), ("SM_CXSIZEFRAME"), ("Window sizing frame width"), ("SM_CYSIZEFRAME"), ("Window sizing frame height"), ("SM_CXMINTRACK"), ("Minimum window tracking width"), ("SM_CYMINTRACK"), ("Minimum window tracking height"), ("SM_CXDOUBLECLK"), ("Double click x tolerance"), ("SM_CYDOUBLECLK"), ("Double click y tolerance"), ("SM_CXICONSPACING"), ("Horizontal icon spacing"), ("SM_CYICONSPACING"), ("Vertical icon spacing"), ("SM_MENUDROPALIGNMENT"), ("Left or right menu drop"), ("SM_PENWINDOWS"), ("Pen extensions installed"), ("SM_DBCSENABLED"), ("Double-Byte Char Set enabled"), ("SM_CMOUSEBUTTONS"), ("Number of mouse buttons"), ("SM_SECURE"), ("Security present flag"), ("SM_CXEDGE"), ("3-D border width"),

SM_CYEDGE, SM_CXMINSPACING, SM_CYMINSPACING, SM_CXSMICON, SM_CYSMICON, SM_CYSMCAPTION, SM_CXSMSIZE, SM_CYSMSIZE, SM_CXMENUSIZE, SM_CYMENUSIZE, SM_ARRANGE, SM_CXMINIMIZED, SM_CYMINIMIZED, SM_CXMAXTRACK, SM_CYMAXTRACK, SM_CXMAXIMIZED, SM_CYMAXIMIZED, SM_NETWORK, SM_CLEANBOOT, SM_CXDRAG, SM_CYDRAG, SM_SHOWSOUNDS, SM_CXMENUCHECK, SM_CYMENUCHECK, SM_SLOWMACHINE, SM_MIDEASTENABLED, SM_MOUSEWHEELPRESENT, SM_XVIRTUALSCREEN, SM_YVIRTUALSCREEN, SM_CXVIRTUALSCREEN, SM_CYVIRTUALSCREEN, SM_CMONITORS, SM_SAMEDISPLAYFORMAT,

TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT

("SM_CYEDGE"), ("3-D border height"), ("SM_CXMINSPACING"), ("Minimized window spacing width"), ("SM_CYMINSPACING"), ("Minimized window spacing height"), ("SM_CXSMICON"), ("Small icon width"), ("SM_CYSMICON"), ("Small icon height"), ("SM_CYSMCAPTION"), ("Small caption height"), ("SM_CXSMSIZE"), ("Small caption button width"), ("SM_CYSMSIZE"), ("Small caption button height"), ("SM_CXMENUSIZE"), ("Menu bar button width"), ("SM_CYMENUSIZE"), ("Menu bar button height"), ("SM_ARRANGE"), ("How minimized windows arranged"), ("SM_CXMINIMIZED"), ("Minimized window width"), ("SM_CYMINIMIZED"), ("Minimized window height"), ("SM_CXMAXTRACK"), ("Maximum dragable width"), ("SM_CYMAXTRACK"), ("Maximum dragable height"), ("SM_CXMAXIMIZED"), ("Width of maximized window"), ("SM_CYMAXIMIZED"), ("Height of maximized window"), ("SM_NETWORK"), ("Network present flag"), ("SM_CLEANBOOT"), ("How system was booted"), ("SM_CXDRAG"), ("Avoid drag x tolerance"), ("SM_CYDRAG"), ("Avoid drag y tolerance"), ("SM_SHOWSOUNDS"), ("Present sounds visually"), ("SM_CXMENUCHECK"), ("Menu check-mark width"), ("SM_CYMENUCHECK"), ("Menu check-mark height"), ("SM_SLOWMACHINE"), ("Slow processor flag"), ("SM_MIDEASTENABLED"), ("Hebrew and Arabic enabled flag"), ("SM_MOUSEWHEELPRESENT"), ("Mouse wheel present flag"), ("SM_XVIRTUALSCREEN"), ("Virtual screen x origin"), ("SM_YVIRTUALSCREEN"), ("Virtual screen y origin"), ("SM_CXVIRTUALSCREEN"), ("Virtual screen width"), ("SM_CYVIRTUALSCREEN"), ("Virtual screen height"), ("SM_CMONITORS"), ("Number of monitors"), ("SM_SAMEDISPLAYFORMAT"), ("Same color format flag")

} ; //MyToolBar.cpp #include "StdAfx.h" #include "resource.h" #include "MyToolBar.h" CMyToolBar::CMyToolBar(void){} CMyToolBar::~CMyToolBar(void){} HWND CMyToolBar::CreateToolBar(int styles, HWND hParent, { InitCommonControls(); hInstance=hInst; hToolBar=CreateWindow( TOOLBARCLASSNAME, , 0, 0, 0, 0, hParent, (HMENU) id, hInst, NULL);

int id , HINSTANCE hInst)

NULL, styles

SendMessage(hToolBar,TB_BUTTONSTRUCTSIZE,sizeof(TBBUTTON),0); //SendMessage(hToolBar,TB_SETEXTENDEDSTYLE,0,TBSTYLE_EX_DRAWDDARROWS); //SendMessage(hToolBar, TB_SETBUTTONWIDTH,0,MAKELONG(32,32)); return hToolBar; } BOOL CMyToolBar::AddButton(BYTE fsState, BYTE fsStyle, int iBitmap, int idCommand, LPTSTR iString, DWORD_PTR dwData) { int iStr = SendMessage(hToolBar, TB_ADDSTRING, 0, (LPARAM) iString); TBBUTTON button[1]; button[0].dwData=dwData; button[0].fsState=fsState|TBSTATE_ENABLED; button[0].iBitmap=STD_COPY;//iBitmap; button[0].fsStyle=fsStyle; button[0].idCommand=idCommand; button[0].iString=iStr;//(INT_PTR)iString; BOOL kq=SendMessage(hToolBar,TB_ADDBUTTONS ,1,(LPARAM)&button); return kq; } void CMyToolBar::SetButtonImages(int cx,int cy, int idb_Image,int btnNums) { SendMessage(hToolBar,TB_SETBITMAPSIZE,0,MAKELONG(cx,cy)); TBADDBITMAP tbAddBitmap; tbAddBitmap.hInst=HINST_COMMCTRL;//hInstance; tbAddBitmap.nID=IDB_STD_LARGE_COLOR;//IDB_BITMAP1; SendMessage(hToolBar,TB_ADDBITMAP,btnNums,(LPARAM)&tbAddBitmap);

} //Neu goi ham nay nhieu lan thi phai goi theo thu tu btnIndex tang dan HWND CMyToolBar::AddNonButtonControl(LPTSTR className,int styles,int ID,int width,int height,int btnIndex,int iCommand) { TBBUTTON button; button.fsState=TBSTATE_ENABLED; button.fsStyle=BTNS_SEP; button.idCommand=iCommand; BOOL kq = SendMessage(hToolBar,TB_INSERTBUTTON ,btnIndex,(LPARAM)&button); TBBUTTONINFO info; info.cbSize=sizeof(TBBUTTONINFO); info.dwMask=TBIF_SIZE; info.cx=width; SendMessage(hToolBar, TB_SETBUTTONINFO, iCommand, (LPARAM)&info);

RECT rect; SendMessage(hToolBar, TB_GETITEMRECT, btnIndex,(LPARAM) &rect); //Neu height=0 thi chieu cao se duoc tinh bang bottom-top //Neu height<>0 thi chieu cao se la height HWND hWnd=CreateWindow( className, NULL, styles, rect.left,rect.top, rect.right-rect.left, height==0?rect.bottom-rect.top:height, hToolBar, (HMENU) ID, hInstance, 0 ); return hWnd; } BOOL CMyToolBar::DoNotify(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { #define lpnm ((LPNMHDR)lParam) #define lpnmTB ((LPNMTOOLBAR)lParam) RECT TPMPARAMS HMENU HMENU BOOL rc; tpm; hPopupMenu = NULL; hMenuLoaded; bRet = FALSE;

switch(lpnm->idFrom) { case 32883: { int t; t=8; break; } } switch(lpnm->code) { case TBN_DROPDOWN: { SendMessage(lpnmTB->hdr.hwndFrom, TB_GETRECT, (WPARAM)lpnmTB->iItem, (LPARAM)&rc); MapWindowPoints(lpnmTB->hdr.hwndFrom, HWND_DESKTOP, (LPPOINT)&rc, 2); tpm.cbSize = sizeof(TPMPARAMS); tpm.rcExclude = rc; hMenuLoaded = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1)); hPopupMenu = GetSubMenu(hMenuLoaded,0); TrackPopupMenuEx(hPopupMenu, TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL, rc.left, rc.bottom, hToolBar, &tpm); DestroyMenu(hMenuLoaded); } break; } return FALSE; } // ToolbarDemo.cpp : Defines the entry point for the application. // #include "stdafx.h" #include "ToolbarDemo.h" #include "mytoolbar.h" #define MAX_LOADSTRING 100 // Global Variables: HINSTANCE hInst; TCHAR szTitle[MAX_LOADSTRING]; TCHAR szWindowClass[MAX_LOADSTRING]; // current instance // The title bar text // the main window class name

// Forward declarations of functions included in this code module: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: Place code here. MSG msg;

HACCEL hAccelTable; // Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_TOOLBARDEMO, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TOOLBARDEMO)); // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; }

// // FUNCTION: MyRegisterClass() // // PURPOSE: Registers the window class. // // COMMENTS: // // This function and its usage are only necessary if you want this code // to be compatible with Win32 systems prior to the 'RegisterClassEx' // function that was added to Windows 95. It is important to call this function // so that the application will get 'well formed' small icons associated // with it. // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style wcex.lpfnWndProc wcex.cbClsExtra wcex.cbWndExtra wcex.hInstance wcex.hIcon wcex.hCursor wcex.hbrBackground wcex.lpszMenuName wcex.lpszClassName wcex.hIconSm = CS_HREDRAW | CS_VREDRAW; = WndProc; = 0; = 0; = hInstance; = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TOOLBARDEMO)); = LoadCursor(NULL, IDC_ARROW); = (HBRUSH)(COLOR_WINDOW+1); = MAKEINTRESOURCE(IDC_TOOLBARDEMO); = szWindowClass; = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex); } CMyToolBar toolBar1; // // FUNCTION: InitInstance(HINSTANCE, int) // // PURPOSE: Saves instance handle and creates main window // // COMMENTS: // // In this function, we save the instance handle in a global variable and // create and display the main program window. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // Store instance handle in our global variable hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } toolBar1.CreateToolBar(WS_CHILD|WS_VISIBLE ,hWnd,1001,hInst); toolBar1.SetButtonImages(16,16,IDB_BITMAP1,5); toolBar1.AddButton(0,BTNS_CHECKGROUP ,0,323,_T("A"),3); toolBar1.AddButton(0,BTNS_CHECKGROUP,1,32883,_T("B"),3); toolBar1.AddButton(0,BTNS_CHECK ,1,3283,_T("C"),3); toolBar1.AddNonButtonControl(_T("combobox"),WS_CHILD|WS_VISIBLE|WS_BORDER|CBS_DROPDOWNLIST,IDC_COMBO1,200,300,2,545); toolBar1.AddNonButtonControl(_T("edit"),WS_CHILD|WS_VISIBLE|WS_BORDER,IDC_EDIT1,200,0,3,565); //SendMessage(toolBar1.hToolBar,TB_CHECKBUTTON ,323,TRUE); //SendMessage(toolBar1.hToolBar,TB_CHECKBUTTON ,32883,TRUE); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } //

// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) // // PURPOSE: Processes messages for the main window. // // WM_COMMAND - process the application menu // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case 323: { HWND h=(HWND)SendMessage(toolBar1.hToolBar,TB_GETTOOLTIPS,0,0); SetWindowText(h,_T("Toi di hoc")); ShowWindow(h,SW_SHOWNORMAL); //MessageBox(hWnd,_T("Vua nhan vao mot nut"),_T("Thong bao"),0); break; } case IDM_ABOUT: { DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; } case IDM_EXIT: DestroyWindow(hWnd); break; case IDC_COMBO1: { switch (wmEvent) { } break; } case IDC_EDIT1: { switch(wmEvent) { } break; } default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_NOTIFY: { if (wParam==1001) { toolBar1.DoNotify(NULL,NULL,NULL,lParam); } break; } case WM_SIZE: { SendMessage(toolBar1.hToolBar,TB_AUTOSIZE,0,0); break; } case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: Add any drawing code here... EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // Message handler for about box. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }

You might also like