【转】走进windows编程的世界-----对话框、文本框、按钮
一、對(duì)話框
1 對(duì)話框的分類
2 對(duì)話框的基本使用方式
3 對(duì)話框資源
4 有模式對(duì)話框的使用
int DialogBox(
?HINSTANCE hInstance,
?LPCTSTR lpTemplate,
?HWND hWndParent,
?DLGPROC lpDialogFunc
);
5 無(wú)模式對(duì)話框的使用
????5.1 添加對(duì)話框資源
????5.2 定義窗口處理函數(shù)
?BOOL CALLBACK DialogProc(
? HWND hwndDlg, ?// handle to dialog box
? ? UINT uMsg, ? ? // message
? ? WPARAM wParam, // first message parameter
? ? LPARAM lParam ? ? ); // second message parameter
????5.3 創(chuàng)建對(duì)話框
?HWND CreateDialog(
? HINSTANCE hInstance,//應(yīng)用程序?qū)嵗浔?br /> ? LPCTSTR lpTemplate,//對(duì)話框的資源ID
? HWND hWndParent,//父窗口
? DLGPROC lpDialogFunc );//對(duì)話框的窗口處理函數(shù)
?????返回值是創(chuàng)建好的對(duì)話框的窗口句柄。
????5.4 顯示對(duì)話框
???????ShowWindow
????5.5 關(guān)閉對(duì)話框
???????EndDialog
????5.6 與有模式對(duì)話框?qū)Ρ?br /> ???????創(chuàng)建函數(shù): 有模式對(duì)話框 DialogBox
?????????????????無(wú)模式對(duì)話框 CreateDialog
???????程序執(zhí)行方式:?
????????有模式對(duì)話框會(huì)阻塞,禁止其他窗口的輸入
????????無(wú)模式對(duì)話框會(huì)讓主程序,不影響其它窗口的輸入
??6 對(duì)話框中的消息????????
??
????WM_INITDIALOG消息,用途類似于WM_CREATE消息
????可以在對(duì)話框創(chuàng)建完成后,進(jìn)行數(shù)據(jù)初始化.
????它與WM_CREATE不同之處是,WM_INITDIALOG消息
????會(huì)在對(duì)話框資源模板上的所有子控件(按鈕等)
????創(chuàng)建完成后,再發(fā)送給對(duì)話框窗口.?
??????wParam - 當(dāng)前接受輸入焦點(diǎn)子控件窗口句柄
??????lParam - 創(chuàng)建時(shí)附帶的參數(shù)
??7 對(duì)話框和普通窗口的對(duì)比
????7.1 創(chuàng)建方式?
??????普通窗口: CreateWindow/Ex
??????對(duì)話框: DialogBox/CreateDialog
????7.2 消息
??????普通窗口: 會(huì)收到WM_CREATE
??????對(duì)話框:???WM_INITDIALOG
????7.3 關(guān)閉方式:
??????普通窗口: DestoryWindow等
??????對(duì)話框: EndDialog
// windialog.cpp : 定義應(yīng)用程序的入口點(diǎn)。
//
?
#include "stdafx.h"
#include "windialog.h"
?
#define MAX_LOADSTRING 100
?
// 全局變量:
HINSTANCE hInst;?? ??? ??? ??? ??? ??? ??? ??? ?// 當(dāng)前實(shí)例
TCHAR szTitle[MAX_LOADSTRING];?? ??? ??? ??? ??? ?// 標(biāo)題欄文本
TCHAR szWindowClass[MAX_LOADSTRING];?? ??? ??? ?// 主窗口類名
?
// 此代碼模塊中包含的函數(shù)的前向聲明:
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: 在此放置代碼。
?? ?MSG msg;
?? ?HACCEL hAccelTable;
?
?? ?// 初始化全局字符串
?? ?LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
?? ?LoadString(hInstance, IDC_WINDIALOG, szWindowClass, MAX_LOADSTRING);
?? ?MyRegisterClass(hInstance);
?
?? ?// 執(zhí)行應(yīng)用程序初始化:
?? ?if (!InitInstance (hInstance, nCmdShow))
?? ?{
?? ??? ?return FALSE;
?? ?}
?
?? ?hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDIALOG));
?
?? ?// 主消息循環(huán):
?? ?while (GetMessage(&msg, NULL, 0, 0))
?? ?{
?? ??? ?if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
?? ??? ?{
?? ??? ??? ?TranslateMessage(&msg);
?? ??? ??? ?DispatchMessage(&msg);
?? ??? ?}
?? ?}
?
?? ?return (int) msg.wParam;
}
?
?
?
//
// ?函數(shù): MyRegisterClass()
//
// ?目的: 注冊(cè)窗口類。
//
// ?注釋:
//
// ? ?僅當(dāng)希望
// ? ?此代碼與添加到 Windows 95 中的“RegisterClassEx”
// ? ?函數(shù)之前的 Win32 系統(tǒng)兼容時(shí),才需要此函數(shù)及其用法。調(diào)用此函數(shù)十分重要,
// ? ?這樣應(yīng)用程序就可以獲得關(guān)聯(lián)的
// ? ?“格式正確的”小圖標(biāo)。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
?? ?WNDCLASSEX wcex;
?
?? ?wcex.cbSize = sizeof(WNDCLASSEX);
?
?? ?wcex.style?? ??? ??? ?= CS_HREDRAW | CS_VREDRAW;
?? ?wcex.lpfnWndProc?? ?= WndProc;
?? ?wcex.cbClsExtra?? ??? ?= 0;
?? ?wcex.cbWndExtra?? ??? ?= 0;
?? ?wcex.hInstance?? ??? ?= hInstance;
?? ?wcex.hIcon?? ??? ??? ?= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDIALOG));
?? ?wcex.hCursor?? ??? ?= LoadCursor(NULL, IDC_ARROW);
?? ?wcex.hbrBackground?? ?= (HBRUSH)(COLOR_WINDOW+1);
?? ?wcex.lpszMenuName?? ?= MAKEINTRESOURCE(IDC_WINDIALOG);
?? ?wcex.lpszClassName?? ?= szWindowClass;
?? ?wcex.hIconSm?? ??? ?= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
?
?? ?return RegisterClassEx(&wcex);
}
?
//
// ? 函數(shù): InitInstance(HINSTANCE, int)
//
// ? 目的: 保存實(shí)例句柄并創(chuàng)建主窗口
//
// ? 注釋:
//
// ? ? ? ?在此函數(shù)中,我們?cè)谌肿兞恐斜4鎸?shí)例句柄并
// ? ? ? ?創(chuàng)建和顯示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
? ?HWND hWnd;
?
? ?hInst = hInstance; // 將實(shí)例句柄存儲(chǔ)在全局變量中
?
? ?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;
}
?
BOOL CALLBACK SettingDlgProc_1(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
?
? ? switch(message){
?? ?case WM_CREATE: //不會(huì)發(fā)生
? ? ? ? MessageBox( NULL, "WM_CREATE",
? ? ? ? ? ? "WinDlg", MB_OK );
? ? ? ? break;
?
?? ?case WM_INITDIALOG:
?? ??? ??? ?/*類似于 WM_CREATE 消息,可以在對(duì)話框常見(jiàn)完成后,進(jìn)行數(shù)據(jù)初始化
?? ??? ??? ?*不同的是:WM_INITDIALOG 會(huì)在對(duì)話框資源莫班上所有的空間創(chuàng)建完成后發(fā)送給對(duì)話框窗口
?? ??? ??? ?* wParam :當(dāng)前接受輸入焦點(diǎn)子控件窗口句柄
?? ??? ??? ?* lParam :創(chuàng)建時(shí)附帶的參數(shù)
?? ??? ??? ?*/
? ? ? ? MessageBox( NULL, "WM_INITDIALOG","WinDlg", MB_OK );
? ? ? ? break;
?
?? ?case WM_SYSCOMMAND:
?? ??? ?switch(wParam){
?? ??? ?case SC_CLOSE:
?? ??? ??? ?EndDialog(hwndDlg,1);
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?//EndDialog(hwndDlg,0);
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?break;
?? ?default:
?? ??? ?break;
?? ?}
?
?? ?//默認(rèn)對(duì)話框處理函數(shù)
?? ?//return DefDlgProc(hwndDlg, message, wParam, lParam);
?? ?return 0;
}
//
// ?函數(shù): WndProc(HWND, UINT, WPARAM, LPARAM)
//
// ?目的: 處理主窗口的消息。
//
// ?WM_COMMAND?? ?- 處理應(yīng)用程序菜單
// ?WM_PAINT?? ?- 繪制主窗口
// ?WM_DESTROY?? ?- 發(fā)送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
?? ?int wmId, wmEvent;
?? ?PAINTSTRUCT ps;
?? ?HDC hdc;
?? ?HWND hdlg;
?
?? ?switch (message)
?? ?{
?? ?case WM_CREATE: //會(huì)發(fā)生
? ? ? ? MessageBox( NULL, "WM_CREATE",
? ? ? ? ? ? "WinDlg", MB_OK );
? ? ? ? break;
?
?? ?case WM_COMMAND:
?? ??? ?wmId ? ?= LOWORD(wParam);
?? ??? ?wmEvent = HIWORD(wParam);
?? ??? ?int ret;
?? ??? ?// 分析菜單選擇:
?? ??? ?switch (wmId)
?? ??? ?{
?? ??? ?case ID_32771:
?? ??? ??? ?//有模式對(duì)話框會(huì)阻塞,禁止其他窗口的輸入?
?? ??? ??? ?ret = DialogBox(hInst,MAKEINTRESOURCE(ID_SETTING),hWnd,SettingDlgProc_1);
?
?? ??? ??? ?if(ret != 2){
?? ??? ??? ??? ?MessageBox(NULL,"取消配置","windialog",MB_OK);
?? ??? ??? ?}else{
?? ??? ??? ??? ?MessageBox(NULL,"確定配置","windialog",MB_OK);
?? ??? ??? ?}
?
?
?? ??? ??? ?break;
?? ??? ?case ID_32772:
?? ??? ??? ?//無(wú)模式對(duì)話框會(huì)讓主程序,不影響其它窗口的輸入
?? ??? ??? ?hdlg = CreateDialog(hInst,MAKEINTRESOURCE(ID_SETTING),hWnd,SettingDlgProc_1);
?
?? ??? ??? ?//顯示對(duì)話框
?? ??? ??? ?ShowWindow(hdlg,SW_SHOW);
?? ??? ??? ?break;
?? ??? ?case IDM_ABOUT:
?? ??? ??? ?DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
?? ??? ??? ?break;
?? ??? ?case IDM_EXIT:
?? ??? ??? ?DestroyWindow(hWnd);
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?return DefWindowProc(hWnd, message, wParam, lParam);
?? ??? ?}
?? ??? ?break;
?? ?case WM_PAINT:
?? ??? ?hdc = BeginPaint(hWnd, &ps);
?? ??? ?// TODO: 在此添加任意繪圖代碼...
?? ??? ?EndPaint(hWnd, &ps);
?? ??? ?break;
?? ?case WM_DESTROY:
?? ??? ?PostQuitMessage(0);
?? ??? ?break;
?? ?default:
?? ??? ?return DefWindowProc(hWnd, message, wParam, lParam);
?? ?}
?? ?return 0;
}
?
// “關(guān)于”框的消息處理程序。
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;
}
一、靜態(tài)框
1 靜態(tài)框創(chuàng)建
????窗口類的名稱 - STATIC, 用于窗口上
????顯示文字等, 如果使用SS_ICON/SS_BITMAP
????風(fēng)格可以顯示ICON和BITMAP
????
????文本靜態(tài)框 - 創(chuàng)建時(shí)使用SS_SIMPLE即可
????ICON靜態(tài)框 - 創(chuàng)建時(shí)需要使用SS_ICON, 并且將靜態(tài)框的窗口名稱設(shè)置成對(duì)應(yīng)ICON的資源ID號(hào),例如"#101".
????
??2 靜態(tài)框的命令相應(yīng)
????2.1 靜態(tài)框要添加SS_NOTIFY風(fēng)格
????2.2 WM_COMMAND進(jìn)行處理
???????WPARAM - HIWORD 命令I(lǐng)D
????????????????LOWORD 靜態(tài)框的窗口ID
???????LPARAM - 靜態(tài)框的窗口句柄.??
????
??3 靜態(tài)框的消息
????調(diào)用SendMessage函數(shù),向Static控件發(fā)送消息
????例如: STM_SETICON消息修改控件顯示圖標(biāo)
??????SendMessage( hStatic, STM_SETICON,
????(WPARAM)hIcon, 0 );
??其他:
???GetDlgItem 從窗口中獲取指定ID的子控件的窗口句柄
// WinStatic.cpp : 定義應(yīng)用程序的入口點(diǎn)。
//
?
#include "stdafx.h"
#include "WinStatic.h"
?
#define MAX_LOADSTRING 100
?
// 全局變量:
HINSTANCE hInst;?? ??? ??? ??? ??? ??? ??? ??? ?// 當(dāng)前實(shí)例
TCHAR szTitle[MAX_LOADSTRING];?? ??? ??? ??? ??? ?// 標(biāo)題欄文本
TCHAR szWindowClass[MAX_LOADSTRING];?? ??? ??? ?// 主窗口類名
?
// 此代碼模塊中包含的函數(shù)的前向聲明:
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: 在此放置代碼。
?? ?MSG msg;
?? ?HACCEL hAccelTable;
?
?? ?// 初始化全局字符串
?? ?LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
?? ?LoadString(hInstance, IDC_WINSTATIC, szWindowClass, MAX_LOADSTRING);
?? ?MyRegisterClass(hInstance);
?
?? ?// 執(zhí)行應(yīng)用程序初始化:
?? ?if (!InitInstance (hInstance, nCmdShow))
?? ?{
?? ??? ?return FALSE;
?? ?}
?
?? ?hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINSTATIC));
?
?? ?// 主消息循環(huán):
?? ?while (GetMessage(&msg, NULL, 0, 0))
?? ?{
?? ??? ?if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
?? ??? ?{
?? ??? ??? ?TranslateMessage(&msg);
?? ??? ??? ?DispatchMessage(&msg);
?? ??? ?}
?? ?}
?
?? ?return (int) msg.wParam;
}
?
?
?
//
// ?函數(shù): MyRegisterClass()
//
// ?目的: 注冊(cè)窗口類。
//
// ?注釋:
//
// ? ?僅當(dāng)希望
// ? ?此代碼與添加到 Windows 95 中的“RegisterClassEx”
// ? ?函數(shù)之前的 Win32 系統(tǒng)兼容時(shí),才需要此函數(shù)及其用法。調(diào)用此函數(shù)十分重要,
// ? ?這樣應(yīng)用程序就可以獲得關(guān)聯(lián)的
// ? ?“格式正確的”小圖標(biāo)。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
?? ?WNDCLASSEX wcex;
?
?? ?wcex.cbSize = sizeof(WNDCLASSEX);
?
?? ?wcex.style?? ??? ??? ?= CS_HREDRAW | CS_VREDRAW;
?? ?wcex.lpfnWndProc?? ?= WndProc;
?? ?wcex.cbClsExtra?? ??? ?= 0;
?? ?wcex.cbWndExtra?? ??? ?= 0;
?? ?wcex.hInstance?? ??? ?= hInstance;
?? ?wcex.hIcon?? ??? ??? ?= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINSTATIC));
?? ?wcex.hCursor?? ??? ?= LoadCursor(NULL, IDC_ARROW);
?? ?wcex.hbrBackground?? ?= (HBRUSH)(COLOR_WINDOW+1);
?? ?wcex.lpszMenuName?? ?= MAKEINTRESOURCE(IDC_WINSTATIC);
?? ?wcex.lpszClassName?? ?= szWindowClass;
?? ?wcex.hIconSm?? ??? ?= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
?
?? ?return RegisterClassEx(&wcex);
}
?
//
// ? 函數(shù): InitInstance(HINSTANCE, int)
//
// ? 目的: 保存實(shí)例句柄并創(chuàng)建主窗口
//
// ? 注釋:
//
// ? ? ? ?在此函數(shù)中,我們?cè)谌肿兞恐斜4鎸?shí)例句柄并
// ? ? ? ?創(chuàng)建和顯示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
? ?HWND hWnd;
?
? ?hInst = hInstance; // 將實(shí)例句柄存儲(chǔ)在全局變量中
?
? ?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;
}
?
void OnCreate( HWND hWnd, UINT nMsg,
? ? WPARAM wParam, LPARAM lParam )
{
? ? CreateWindow( "STATIC", "hello Static",
? ? ? ? WS_CHILD|WS_VISIBLE|SS_SUNKEN|SS_SIMPLE|SS_NOTIFY,
? ? ? ? 50, 50, 100, 100, hWnd, (HMENU)1001,
? ? ? ? hInst, NULL );
?
? ? CreateWindow( "STATIC", "#IDI_ICON2", ? ? //已經(jīng)創(chuàng)建了一個(gè)icon圖標(biāo),ID為101
? ? ? ? WS_CHILD|WS_VISIBLE|SS_SUNKEN|SS_ICON|SS_NOTIFY,
? ? ? ? 200, 50, 100, 100, hWnd, (HMENU)1002,
? ? ? ? hInst, NULL );
}
?
void OnCommand( HWND hWnd, UINT nMsg,
? ? WPARAM wParam, LPARAM lParam )
{
? ? int nCmdID ?= HIWORD( wParam );
? ? int nCtrlID = LOWORD( wParam );
? ? switch( nCtrlID ){
?? ?case ID_32771:
?? ??? ??? ?{
?? ??? ??? ??? ?HICON hIcon = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1));
?? ??? ??? ??? ?//通過(guò)ID獲取多窗口的句柄
?? ??? ??? ??? ?HWND ?hStatic = GetDlgItem(hWnd,1002);
?? ??? ??? ??? ?SendMessage(hStatic,STM_SETICON,(WPARAM)hIcon,0);
?? ??? ??? ?}
? ? case 1001:
?? ??? ?{
? ? ? ? ? ? switch( nCmdID )
? ? ? ? ? ? {
? ? ? ? ? ? case STN_CLICKED:
? ? ? ? ? ? ? ? MessageBox( NULL, "Hello Static 1001",
? ? ? ? ? ? ? ? ? ? "WinStatic", MB_OK );
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? break;
? ? case 1002:
? ? ? ? {
? ? ? ? ? ? switch( nCmdID )
? ? ? ? ? ? {
? ? ? ? ? ? case STN_CLICKED:
? ? ? ? ? ? ? ? MessageBox( NULL, "Hello Static 1002",
? ? ? ? ? ? ? ? ? ? "WinStatic", MB_OK );
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? break;
?? ?case IDM_ABOUT:
?? ??? ??? ?DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
?? ??? ??? ?break;
?? ?case IDM_EXIT:
?? ??? ??? ?DestroyWindow(hWnd);
?? ??? ??? ?break;
?? ?default:
?? ??? ? DefWindowProc(hWnd, nMsg, wParam, lParam);
? ? }
}
//
// ?函數(shù): WndProc(HWND, UINT, WPARAM, LPARAM)
//
// ?目的: 處理主窗口的消息。
//
// ?WM_COMMAND?? ?- 處理應(yīng)用程序菜單
// ?WM_PAINT?? ?- 繪制主窗口
// ?WM_DESTROY?? ?- 發(fā)送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
?? ?int wmId, wmEvent;
?? ?PAINTSTRUCT ps;
?? ?HDC hdc;
?
?? ?switch (message)
?? ?{
?? ?case WM_CREATE:
? ? ? ? OnCreate( hWnd, message, wParam, lParam );
? ? ? ? break;
? ? case WM_COMMAND:
? ? ? ? OnCommand( hWnd, message, wParam, lParam );
? ? ? ? break;
?? ?case WM_PAINT:
?? ??? ?hdc = BeginPaint(hWnd, &ps);
?? ??? ?// TODO: 在此添加任意繪圖代碼...
?? ??? ?EndPaint(hWnd, &ps);
?? ??? ?break;
?? ?case WM_DESTROY:
?? ??? ?PostQuitMessage(0);
?? ??? ?break;
?? ?default:
?? ??? ?return DefWindowProc(hWnd, message, wParam, lParam);
?? ?}
?? ?return 0;
}
?
// “關(guān)于”框的消息處理程序。
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;
}
?
三、按鈕(button)
注冊(cè)類名:button,根據(jù)style 區(qū)分不同的
???1 按鈕的分類?
?????根據(jù)創(chuàng)建按鈕時(shí)使用的風(fēng)格:
?????1.1 下壓式按鈕 PUSH BUTTON?
????????正常下壓式按鈕 BS_PUSHBUTTON?
????????三態(tài)下壓按鈕 BS_3STATE/BS_AUTO3STATE
?????1.2 分組按鈕 Group Button
????????按鈕樣式:BS_GROUPBOX
?????1.3 多選按鈕???Check Box?
????????按鈕樣式:BS_CHECKBOX/BS_AUTOCHECKBOX
?????1.4 單選按鈕???Radio Box
????????按鈕樣式:BS_RADIOBUTTON/
?????????????????BS_AUTORADIOBUTTON
?????????????????
???2 下壓式按鈕的使用
?????2.1 創(chuàng)建按鈕
????????創(chuàng)建時(shí)使用BUTTON
?????2.2 命令消息
????????BN_CLICKED消息: 當(dāng)點(diǎn)擊按鈕通過(guò)WM_COMMAND消息通知父窗口
?????2.3 通知消息?
????????SendMessage
????????
???3 分組按鈕
?????3.1 創(chuàng)建分組按鈕
?????3.2 常用于對(duì)窗口內(nèi)控件劃分區(qū)域,增加界面的友好性
????????
???4 多選按鈕 CheckBox
?????4.1 創(chuàng)建使用 BS_CHECKBOX/BS_AUTOCHECKBOX
???????BS_AUTOCHECKBOX 選擇狀態(tài)系統(tǒng)自動(dòng)維護(hù)
???????BS_CHECKBOX 選擇狀態(tài)需要自己維護(hù)
?????4.2 命令響應(yīng)
???????BN_CLICKED 通過(guò)WM_COMMAND消息
?????4.3 通知消息
???????BM_GETCHECK 獲取當(dāng)前按鈕被選擇的狀態(tài)
???????BM_SETCHECK 設(shè)置當(dāng)前按鈕被選擇的狀態(tài)
??????????wParam 用于設(shè)置狀態(tài)標(biāo)示
???????狀態(tài): BST_CHECKED 或 BST_UNCHECKED
???????
???5 單選按鈕 RadioBox
?????5.1 創(chuàng)建使用 BS_RADIOBUTTON/BS_AUTORADIOBUTTON
???????BS_AUTORADIOBUTTON 選擇狀態(tài)系統(tǒng)自動(dòng)維護(hù)
???????BS_RADIOBUTTON 選擇狀態(tài)需要自己維護(hù)
???????注意:
???????RadionBox分組 - 使用WS_GROUP樣式,可以將
???????RadionBox分成多個(gè)組.
??????????A CreateWindow (??,,,WS_GROUP );
??????????B CreateWindow...
??????????C CreateWindow (??,,,WS_GROUP );
??????????D CreaetWindow...
??????????A和B是一組, C和D是一組
?????5.2 命令響應(yīng)
???????BN_CLICKED 通過(guò)WM_COMMAND消息
?????5.3 通知消息
???????與CheckBox類似
// WinButton.cpp : Defines the entry point for the application.
//
?
#include <Windows.h>
#include <stdio.h>
?
HINSTANCE g_hInst = NULL;
?
void OnCreate( HWND hWnd, UINT nMsg,
? ? WPARAM wParam, LPARAM lParam )
{ ? ?//PUSH BUTTON
? ? CreateWindow( "BUTTON", "PushButton",
? ? ? ? WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,?
? ? ? ? 100, 50, 100, 30,?
? ? ? ? hWnd, (HMENU)1001, g_hInst, NULL );
? ? //三態(tài)按鈕
? ? CreateWindow( "BUTTON", "Auto3State",
? ? ? ? WS_CHILD|WS_VISIBLE|BS_AUTO3STATE|BS_PUSHLIKE,?
? ? ? ? 100, 100, 100, 30,?
? ? ? ? hWnd, (HMENU)2001, g_hInst, NULL );
? ? //分組按鈕
? ? CreateWindow( "BUTTON", "分組一",
? ? ? ? WS_CHILD|WS_VISIBLE|BS_GROUPBOX,?
? ? ? ? 50, 30, 250, 400,
? ? ? ? hWnd, (HMENU)3001, g_hInst, NULL );
? ? //多選按鈕 CheckBox
? ? CreateWindow( "BUTTON", "選項(xiàng)一",
? ? ? ? WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX,?
? ? ? ? 100, 150, 100, 30,
? ? ? ? hWnd, (HMENU)4001, g_hInst, NULL );
? ? CreateWindow( "BUTTON", "選項(xiàng)二",
? ? ? ? WS_CHILD|WS_VISIBLE|BS_CHECKBOX,?
? ? ? ? 100, 180, 100, 30,
? ? ? ? hWnd, (HMENU)4002, g_hInst, NULL );
? ? // 單選按鈕
? ? CreateWindow( "BUTTON", "A",?
? ? ? ? WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP,
? ? ? ? 100, 240, 100, 30, hWnd,?
? ? ? ? (HMENU)5001, g_hInst, NULL );
? ? CreateWindow( "BUTTON", "B",?
? ? ? ? WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,
? ? ? ? 100, 270, 100, 30, hWnd,?
? ? ? ? (HMENU)5002, g_hInst, NULL );
? ? CreateWindow( "BUTTON", "C",?
? ? ? ? WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP, ?//遇到WS_GROUP,表示新的一組單選按鈕
? ? ? ? 100, 300, 100, 30, hWnd,?
? ? ? ? (HMENU)5003, g_hInst, NULL );
? ? CreateWindow( "BUTTON", "D",?
? ? ? ? WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,
? ? ? ? 100, 330, 100, 30, hWnd,?
? ? ? ? (HMENU)5004, g_hInst, NULL );
?
?? ?//創(chuàng)建記事本
?? ?CreateWindow( "EDIT", "Hello EDIT",
? ? ? ? WS_CHILD|WS_VISIBLE/*|WS_HSCROLL|
? ? ? ? WS_VSCROLL|ES_AUTOHSCROLL|
?? ??? ?ES_AUTOVSCROLL|ES_MULTILINE 多行*/|ES_PASSWORD,?
? ? ? ? 0, 0, 100, 50, hWnd,
? ? ? ? (HMENU)1001, g_hInst, NULL );
}
?
void OnCommand( HWND hWnd, UINT nMsg,
? ? WPARAM wParam, LPARAM lParam )
{ ? ?
? ? int nNotifyCode = HIWORD( wParam );
? ? int nEventID ? ?= LOWORD( wParam );
? ? switch( nEventID )
? ? {
? ? case 1001:
? ? ? ? {
? ? ? ? ? ? switch( nNotifyCode )
? ? ? ? ? ? {
? ? ? ? ? ? case BN_CLICKED:
? ? ? ? ? ? ? ? MessageBox( NULL, "Hello PushButton",
? ? ? ? ? ? ? ? ? ? "WinButton", MB_OK );
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? break;
?
? ? ?case 2001:
? ? ? ? {
? ? ? ? ? ? switch( nNotifyCode )
? ? ? ? ? ? {
? ? ? ? ? ? case BN_CLICKED:
? ? ? ? ? ? ? ? MessageBox( NULL, "Hello Auto3State",
? ? ? ? ? ? ? ? ? ? "WinButton", MB_OK );
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? break;
? ? case 4002:
? ? ? ? {
? ? ? ? ? ? HWND hCtrl = GetDlgItem( hWnd, 4002 );
? ? ? ? ? ? LRESULT nCheck = 0;
? ? ? ? ? ? switch( nNotifyCode )
? ? ? ? ? ? {
? ? ? ? ? ? case BN_CLICKED:
? ? ? ? ? ? ? ? //獲取當(dāng)前CheckBox的狀態(tài)
? ? ? ? ? ? ? ? nCheck = SendMessage( hCtrl,?
? ? ? ? ? ? ? ? ? ? BM_GETCHECK, 0, 0 );
? ? ? ? ? ? ? ? //判斷當(dāng)前狀態(tài)是否被選擇
? ? ? ? ? ? ? ? if( nCheck & BST_CHECKED )
? ? ? ? ? ? ? ? { ? ?//設(shè)置為不選擇狀態(tài)
? ? ? ? ? ? ? ? ? ? SendMessage( hCtrl,BM_SETCHECK,
? ? ? ? ? ? ? ? ? ? ? ? BST_UNCHECKED, 0 );
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? { ? ?//設(shè)置成選擇狀態(tài)
? ? ? ? ? ? ? ? ? ? SendMessage( hCtrl,BM_SETCHECK,
? ? ? ? ? ? ? ? ? ? ? ? BST_CHECKED, 0 );
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? break;
? ? }
}
?
LRESULT CALLBACK WndProc( HWND ? hWnd,?
? ? ? ? ? ? ? ? ? ? ? ? ? UINT ? nMsg,
? ? ? ? ? ? ? ? ? ? ? ? ? WPARAM wParam,
? ? ? ? ? ? ? ? ? ? ? ? ? LPARAM lParam )
{
? ? switch( nMsg )
? ? {
? ? case WM_CREATE:
? ? ? ? OnCreate( hWnd, nMsg, wParam, lParam );
? ? ? ? break;
? ? case WM_COMMAND:
? ? ? ? OnCommand( hWnd, nMsg, wParam, lParam );
? ? ? ? break;
? ? case WM_DESTROY:
? ? ? ? PostQuitMessage( 0 );
? ? ? ? return 0;
? ? }
? ? return DefWindowProc( hWnd, nMsg,
? ? ? ? wParam, lParam );
}
?
BOOL RegisterWnd( LPSTR pszClassName )
{
? ? WNDCLASSEX wce = { 0 };
? ? wce.cbSize ? ? ? ?= sizeof( wce );
? ? wce.cbClsExtra ? ?= 0;
? ? wce.cbWndExtra ? ?= 0;
? ? wce.hbrBackground = HBRUSH(COLOR_WINDOW);
? ? wce.hCursor ? ? ? = NULL;
? ? wce.hIcon ? ? ? ? = NULL;
? ? wce.hIconSm ? ? ? = NULL;
? ? wce.hInstance ? ? = g_hInst;
? ? wce.lpfnWndProc ? = WndProc;
? ? wce.lpszClassName = pszClassName;
? ? wce.lpszMenuName ?= NULL;
? ? wce.style ? ? ? ? = CS_HREDRAW|CS_VREDRAW;
?
? ? ATOM nAtom = RegisterClassEx( &wce );
? ? if( 0 == ?nAtom )
? ? {
? ? ? ? return FALSE;
? ? }
?
? ? return TRUE;
}
?
HWND CreateWnd( LPSTR pszClassName )
{
? ? HWND hWnd = CreateWindowEx( 0,
? ? ? ? pszClassName, "MyWnd",?
? ? ? ? WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
? ? ? ? CW_USEDEFAULT, CW_USEDEFAULT,
? ? ? ? CW_USEDEFAULT, NULL, NULL, g_hInst,
? ? ? ? NULL );
? ? return hWnd;
}
?
void DisplayWnd( HWND hWnd )
{
? ? ShowWindow( hWnd, SW_SHOW );
? ? UpdateWindow( hWnd );
}
?
void Message( )
{
? ? MSG msg = { 0 };
? ? while( GetMessage( &msg, NULL, 0, 0 ) )
? ? {
? ? ? ? TranslateMessage( &msg );
? ? ? ? DispatchMessage( &msg );
? ? }
}
?
int APIENTRY WinMain(HINSTANCE hInstance,
? ? ? ? ? ? ? ? ? ? ?HINSTANCE hPrevInstance,
? ? ? ? ? ? ? ? ? ? ?LPSTR ? ? lpCmdLine,
? ? ? ? ? ? ? ? ? ? ?int ? ? ? nCmdShow)
{
? ? g_hInst = hInstance;
? ? RegisterWnd( "MYWND" );
? ? HWND hWnd = CreateWnd( "MYWND" );
? ? DisplayWnd( hWnd );
? ? Message( );
? ? return 0;
}
?1 文本編輯框的樣式
????1.1 單行文本編輯框 - 默認(rèn)樣式
????1.2 多行文本編輯框 - ES_MULTILINE
????1.3 密碼文本編輯框 - ES_PASSWORD
??2 文本編輯框的使用
????2.1 創(chuàng)建?
???????窗口類名稱EDIT.
????2.2 Notify消息
???????EN_CHANGE 當(dāng)編輯框內(nèi)容發(fā)生變化時(shí),會(huì)通知父窗口
????2.3 EDIT窗口消息
???????EM_SETSEL 選擇消息 WPARAM是起始字符位置
???????????LPARAM是終止字符位置
???????窗口消息: WM_COPY, WM_PASET,WM_CUT等消息
?????????WM_SETTEXT, WM_GETTEXT, WM_GETTEXTLEN
?????????SetWindowText
?????????GetWindowText/GetWindowTextLen
/* File : WinEdit.cpp
?* Auth : sjin
?* DATE : 20140720
?* MAil :?
?*/
?
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include "resource.h"
?
?
HINSTANCE g_hInst = NULL;
HWND ? ? ?g_hEdit = NULL;
?
void OnCreate( HWND hWnd, UINT nMsg,?
? ? WPARAM wParam, LPARAM lParam )
{
? ? g_hEdit = CreateWindow( "EDIT", "Hello EDIT",
? ? ? ? WS_CHILD|WS_VISIBLE|WS_HSCROLL|
? ? ? ? WS_VSCROLL|ES_AUTOHSCROLL|
? ? ? ? ES_AUTOVSCROLL|ES_MULTILINE,?
? ? ? ? 0, 0, 100, 200, hWnd,
? ? ? ? (HMENU)1001, g_hInst, NULL );
}
?
void OnSize( HWND hWnd, UINT nMsg,?
? ? WPARAM wParam, LPARAM lParam )
{
? ? int nWidth = LOWORD( lParam );
? ? int nHeight= HIWORD( lParam );
? ? if( NULL != g_hEdit )
? ? { ? ?//將EDIT窗口填滿整個(gè)客戶區(qū)
? ? ? ? MoveWindow( g_hEdit, 0, 0, nWidth,
? ? ? ? ? ? nHeight, TRUE );
? ? }
}
?
void OnSave( )
{
? ? //獲取文字長(zhǎng)度
? ? LRESULT nTextLen = SendMessage( g_hEdit,?
? ? ? ? WM_GETTEXTLENGTH, 0, 0 );
? ? //獲取文字
? ? CHAR * pszBuff = NULL;
? ? pszBuff = (CHAR *)malloc( nTextLen + 1 );
? ? memset( pszBuff, 0, nTextLen + 1 );
? ? SendMessage( g_hEdit, WM_GETTEXT,
? ? ? ? nTextLen + 1, (LPARAM)pszBuff );
? ? MessageBox( NULL, pszBuff, "WinEdit", MB_OK );
? ? //保存文件
? ? FILE * pFile = fopen( "D:\\1.txt", "w+" );
? ? fwrite( pszBuff, nTextLen, 1, pFile );
? ? fclose( pFile );
? ? //釋放內(nèi)存
? ? free( pszBuff );
}
?
void OnOpen( )
{
? ? //打開(kāi)文件讀取數(shù)據(jù)
? ? FILE * pFile = fopen( "D:\\1.txt", "r" );
? ? //獲取文件長(zhǎng)度
? ? fseek( pFile, 0, SEEK_END );
? ? long nFileLen = ftell( pFile );
? ? fseek( pFile, 0, SEEK_SET );
? ? //讀取文件數(shù)據(jù)
? ? CHAR * pszBuf = (CHAR *)
? ? ? ? malloc( nFileLen + 1 );
? ? memset( pszBuf, 0, nFileLen + 1 );
? ? fread( pszBuf, nFileLen, 1, pFile );
? ? //關(guān)閉文件
? ? fclose( pFile );
? ? //將字符顯示在EDIT窗口
? ? SendMessage( g_hEdit, WM_SETTEXT,
? ? ? ? 0, (LPARAM)pszBuf );
? ? //釋放內(nèi)存
? ? free( pszBuf );
}
?
void ?OnCommand( HWND hWnd, UINT nMsg,?
? ? WPARAM wParam, LPARAM lParam )
{
? ? int nNotifyCode = HIWORD( wParam );
? ? int nEventID ? ?= LOWORD( wParam );
? ? switch( nEventID )
? ? {
? ? case 1001:
? ? ? ? {
? ? ? ? ? ? switch( nNotifyCode )
? ? ? ? ? ? {
? ? ? ? ? ? case EN_CHANGE:
? ? ? ? ? ? ? ? //MessageBox( NULL, "EN_CHANGE",
? ? ? ? ? ? ? ? // ? ?"WinEdit", MB_OK );
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? break;
? ? case ID_SELALL:
? ? ? ? SendMessage( g_hEdit, EM_SETSEL, 0, -1 );
? ? ? ? break;
? ? case ID_COPY://復(fù)制
? ? ? ? SendMessage( g_hEdit, WM_COPY, 0, 0 );
? ? ? ? break;
? ? case ID_PASTE:
? ? ? ? SendMessage( g_hEdit, WM_PASTE, 0, 0 );
? ? ? ? break;
? ? case ID_SAVE:
? ? ? ? OnSave( );
? ? ? ? break;
? ? case ID_OPEN:
? ? ? ? OnOpen( );
? ? ? ? break;
? ? }
}
?
LRESULT CALLBACK WndProc( HWND ? hWnd,?
? ? ? ? ? ? ? ? ? ? ? ? ? UINT ? nMsg,
? ? ? ? ? ? ? ? ? ? ? ? ? WPARAM wParam,
? ? ? ? ? ? ? ? ? ? ? ? ? LPARAM lParam )
{
? ? switch( nMsg )
? ? {
? ? case WM_CREATE:
? ? ? ? OnCreate( hWnd, nMsg, wParam, lParam );
? ? ? ? break;
? ? case WM_SIZE:
? ? ? ? OnSize( hWnd, nMsg, wParam, lParam );
? ? ? ? break;
? ? case WM_COMMAND:
? ? ? ? OnCommand( hWnd, nMsg, wParam, lParam );
? ? ? ? break;
? ? case WM_DESTROY:
? ? ? ? PostQuitMessage( 0 );
? ? ? ? return 0;
? ? }
? ? return DefWindowProc( hWnd, nMsg,
? ? ? ? wParam, lParam );
}
?
BOOL RegisterWnd( LPSTR pszClassName )
{
? ? WNDCLASSEX wce = { 0 };
? ? wce.cbSize ? ? ? ?= sizeof( wce );
? ? wce.cbClsExtra ? ?= 0;
? ? wce.cbWndExtra ? ?= 0;
? ? wce.hbrBackground = HBRUSH(COLOR_WINDOW);
? ? wce.hCursor ? ? ? = NULL;
? ? wce.hIcon ? ? ? ? = NULL;
? ? wce.hIconSm ? ? ? = NULL;
? ? wce.hInstance ? ? = g_hInst;
? ? wce.lpfnWndProc ? = WndProc;
? ? wce.lpszClassName = pszClassName;
? ? wce.lpszMenuName ?= NULL;
? ? wce.style ? ? ? ? = CS_HREDRAW|CS_VREDRAW;
?
? ? ATOM nAtom = RegisterClassEx( &wce );
? ? if( 0 == ?nAtom )
? ? {
? ? ? ? return FALSE;
? ? }
?
? ? return TRUE;
}
?
HWND CreateWnd( LPSTR pszClassName )
{
? ? HMENU hMenu = LoadMenu( g_hInst,
? ? ? ? MAKEINTRESOURCE(IDR_MAIN) );
? ? HWND hWnd = CreateWindowEx(?
? ? ? ? WS_EX_CLIENTEDGE,
? ? ? ? pszClassName, "我的記事本",?
? ? ? ? WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
? ? ? ? CW_USEDEFAULT, CW_USEDEFAULT,
? ? ? ? CW_USEDEFAULT, NULL, hMenu, g_hInst,
? ? ? ? NULL );
? ? return hWnd;
}
?
void DisplayWnd( HWND hWnd )
{
? ? ShowWindow( hWnd, SW_SHOW );
? ? UpdateWindow( hWnd );
}
?
void Message( )
{
? ? MSG msg = { 0 };
? ? while( GetMessage( &msg, NULL, 0, 0 ) )
? ? {
? ? ? ? TranslateMessage( &msg );
? ? ? ? DispatchMessage( &msg );
? ? }
}
?
int APIENTRY WinMain(HINSTANCE hInstance,
? ? ? ? ? ? ? ? ? ? ?HINSTANCE hPrevInstance,
? ? ? ? ? ? ? ? ? ? ?LPSTR ? ? lpCmdLine,
? ? ? ? ? ? ? ? ? ? ?int ? ? ? nCmdShow)
{
? ? g_hInst = hInstance;
? ? RegisterWnd( "MYWND" );
? ? HWND hWnd = CreateWnd( "MYWND" );
? ? DisplayWnd( hWnd );
? ? Message( );
? ? return 0;
}
參考資料:
其他控件介紹:
http://www.cnblogs.com/tangzhengyue/archive/2012/08/16/2643149.html
?
總結(jié)
以上是生活随笔為你收集整理的【转】走进windows编程的世界-----对话框、文本框、按钮的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 新东方双语直播火了!销售额3天增1777
- 下一篇: 图森未来要造L4自动驾驶氢燃料重卡:一台