Lập trình C Windows
Nguyen Tri Tuan – Khoa CNTT – DHKHTN Tp.HCM 1/6 // ---------------------------------------------------------------------- // Chương trình demo: Application đơn giản trên Windows // Sử dụng thư viện API của Windows // GENERIC_APP.CPP // Nguyen Tri Tuan - Khoa CNTT – ĐH.KHTN Tp.HCM // ---------------------------------------------------------------------- #include "stdafx.h" #include "resource.h" #define MAX_LOADSTRING 100 // Các biến toàn cục HINSTANCE hInst; // instance của application TCHAR szTitle[MAX_LOADSTRING]; // Tiêu đề của cửa sổ TCHAR szWindowClass[MAX_LOADSTRING]; // Tên lớp cửa sổ (window class name) // Prototype của các hàm xử lý ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); // Hàm xử lý chính của application int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // Khởi tạo các biến chuỗi toàn cục LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_C, szWindowClass, MAX_LOADSTRING); // Đăng ký lớp cửa sổ cho ứng dụng MyRegisterClass(hInstance); // Khởi tạo ứng dụng if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } // Khởi tạo bảng phím tắt (cho các menu item) MSG msg; HACCEL hAccelTable; hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_C); // Vòng lặp tiếp nhận và xử lý thông điệp while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; } // --------------------------------------------------------------------- // Hàm: MyRegisterClass() // Đăng ký lớp cho cửa sổ chính (Frame window) // --------------------------------------------------------------------- ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; Nguyen Tri Tuan – Khoa CNTT – DHKHTN Tp.HCM 2/6 wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_C); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = (LPCSTR)IDC_C; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); return RegisterClassEx(&wcex); } // --------------------------------------------------------------------- // Hàm: InitInstance(HANDLE, int) // Khởi tạo cửa sổ giao diện chính cho ứng dụng // --------------------------------------------------------------------- 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; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // --------------------------------------------------------------------- // Hàm: WndProc(HWND, unsigned, WORD, LONG) // Hàm nhận và xử lý thông điệp cho cửa sổ giao diện chính // --------------------------------------------------------------------- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; TCHAR szHello[MAX_LOADSTRING]; LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Kiểm tra xem user chọn menu item nào: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case IDM_EXIT: Nguyen Tri Tuan – Khoa CNTT – DHKHTN Tp.HCM 3/6 DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // Cập nhật lại nội dung màn hình client RECT rt; GetClientRect(hWnd, &rt); DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER); EndPaint(hWnd, &ps); break; case WM_DESTROY: // Kết thúc ứng dụng PostQuitMessage(0); break; default: // Gọi xử lý thông điệp mặc định return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // --------------------------------------------------------------------- // Hàm: About(HWND, UINT, WPARAM, LPARAM) // Xử lý thông điệp cho cửa sổ hộp thoại About // --------------------------------------------------------------------- LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return TRUE; } break; } return FALSE; } Nguyen Tri Tuan – Khoa CNTT – DHKHTN Tp.HCM 4/6 // ---------------------------------------------------------------------- // File mô tả tài nguyên của ứng dụng (Resource of application) // Generic_App.rc // Nguyen Tri Tuan - Khoa CNTT – ĐH.KHTN Tp.HCM // ---------------------------------------------------------------------- #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #define APSTUDIO_HIDDEN_SYMBOLS #include "windows.h" #undef APSTUDIO_HIDDEN_SYMBOLS #include "resource.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 // ---------------------------------------------------------------------- // Mô tả các icon // ---------------------------------------------------------------------- IDI_C ICON DISCARDABLE "c.ICO" IDI_SMALL ICON DISCARDABLE "SMALL.ICO" // ---------------------------------------------------------------------- // Mô tả các menu // ---------------------------------------------------------------------- IDC_C MENU DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "E&xit", IDM_EXIT END POPUP "&Help" BEGIN MENUITEM "&About .", IDM_ABOUT END END // ---------------------------------------------------------------------- // Mô tả các phím tắt (Accelerator) // ---------------------------------------------------------------------- IDC_C ACCELERATORS MOVEABLE PURE BEGIN "?", IDM_ABOUT, ASCII, ALT "/", IDM_ABOUT, ASCII, ALT END // ---------------------------------------------------------------------- // Mô tả các dialog // ---------------------------------------------------------------------- IDD_ABOUTBOX DIALOG DISCARDABLE 22, 17, 178, 39 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "About" Nguyen Tri Tuan – Khoa CNTT – DHKHTN Tp.HCM 5/6 FONT 8, "System" BEGIN ICON IDI_C,IDC_MYICON,14,9,20,20 LTEXT "Generic App. Version 1.0",IDC_STATIC,39,10,119,8, SS_NOPREFIX LTEXT "Copyright (C) 2004",IDC_STATIC,39,20,83,8 DEFPUSHBUTTON "OK",IDOK,138,25,30,11,WS_GROUP END #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 2 TEXTINCLUDE DISCARDABLE BEGIN "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""resource.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END #endif // APSTUDIO_INVOKED // ---------------------------------------------------------------------- // Mô tả các chuỗi (String table) // ---------------------------------------------------------------------- STRINGTABLE DISCARDABLE BEGIN IDS_APP_TITLE "Generic Application - API" IDS_HELLO "Hello World!" IDC_C "About Generic Application" END #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED Nguyen Tri Tuan – Khoa CNTT – DHKHTN Tp.HCM 6/6 // ---------------------------------------------------------------------- // File header mô tả các hằng số của chương trình. // Generic_App.h // Sử dụng cho: Generic_App.cpp, Generic_App.rc // Nguyen Tri Tuan - Khoa CNTT – ĐH.KHTN Tp.HCM // ---------------------------------------------------------------------- // Used by C.RC // #define IDR_MAINFRAME 128 #define IDD_C_DIALOG 102 #define IDD_ABOUTBOX 103 #define IDS_APP_TITLE 103 #define IDM_ABOUT 104 #define IDM_EXIT 105 #define IDS_HELLO 106 #define IDI_C 107 #define IDI_SMALL 108 #define IDC_C 109 #define IDC_MYICON 2 #define IDC_STATIC -1 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 129 #define _APS_NEXT_COMMAND_VALUE 32771 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 110 #endif #endif . | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance,. LoadIcon(hInstance, (LPCTSTR)IDI _C) ; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = (LPCSTR)IDC _C;