Ví dụ chương trình v ề hộp thoại

Một phần của tài liệu NGÔN NGỮ LẬP TRÌNH WINDOWS (Trang 34 - 41)

2.2. I.2. Hộp thoại và tạo mẫu template cho hộp thoại

2.2.1.5. Ví dụ chương trình v ề hộp thoại

NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH c TRÊN WINDOWS

Đ ể minh họa cho việc trao đổi thông điệp giữa các thành phẩn điều khiển bên trong hộp thoại (đóng vai ữò là một cửa sồ cha) với các thành phẩn điều khiển con nằm bên trong hộp thoại, và cơ chê quản lý hộp thoại của Windows. Chúng ta tiến hành xem xét ví dụ 2-2.

K ết quả thực hiện của chương trình như trong hình 2.5.

c ử a sổ hộp thoại gồm có ba nhóm nút chọn radio.Nhóm thứ nhất dùng đ ể chọn đối tượng v ẽ là hình chữ nhật hay hình ellipse, nhóm thứ hai dùng đ ể chọn màu tô cho hình vẽ, nhóm thứ 3 dùng đ ể chọn kiểu tô cho hĩnh vẽ. Khi thay đổi việc chọn màu tô, kiểu tô thì màu tô và kiểu tô của hình vẽ cạnh bên sẽ thay đổi theo màu tô, và kiểu tô vừa mới chọn. Khi nhấn nút OK thì hộp thoại đóng lại và màu tô, kiểu tô cùng hình v ẽ vừa mới vẽ sẽ được hiển thị lên cửa sổ chính. Nêu nhấn nút Cancel hoặc nhấn phím Esc thì hộp thoại được đóng lại nhưng hình vẽ, màu tô và kiểu tô không được hiển thị lên cửa sổ chính. Trong ví dụ này nút OK và nút Cancel có chỉ danh ID lần lượt là IDOK và IDCANCEL.Thông thường đặt chỉ danh cho các phần tử điều khiển nằm ữong hộp thoại được bắt đẩu bằng chữ ID. Biểu tượng chiếc xe đạp trên hộp thoại đó là một icon. Trên thanh tiêu đề của cửa sổ chính có một biểu tượng, biểu tượng đó cũng là một icon (đó là một ly trà). Khi đặt các nút radio vào hộp thoại bằng công cụ Developer studio nhớ phải đặt các nút đó theo thứ tự như hình 2-5. Thì khi đó Windows mới phát sinh mã cho các nút đó theo thứ tự tăng dần, điều này giúp chúng ta dễ dàng kiểm soát các thao tác trên tập các nút radio. Bạn nhớ bỏ luôn mục chọn Auto trong phẩn thiết lập Properties của các nút chọn radio. Bởi vì các nút radio mang thuộc tính Auto yêu cầu viết ít mã lệnh hơn ngưng chúng thường khó hiểu so với các nút không có thuộc tính Auto. Chọn thuộc đnh Group, Tab stop trong phần thiết kê Properties của nút OK, nút Cancel, và hai nút radio đầu tiên trong ba nhóm radio để có thể chuyển focus (chọn) bằng phím Tab trên bàn phím.

JOJ*]

Biush

H5_b L>IA b U N A L

r HS.CROSS

c H S _ D IA G C R O S S

r HS_FDlAGONAL

r HS_HORIZONTAL

r HS_VERTICAL OK

Hình 2.5 Minh họa trao đổi thông điệp qua các điều khiển Chương trình minh họa (Ví dụ 2.2):

DIALOG2.CPP (trích dẫn)

#include <windows.h>

#include "resource.h"

LRESULT CALLBACK VVndProc (HWND, UINT, WPARAM, LPARAM);

WINDOWS

BOOL CALLBACK DialogProc (HWND, UINT, WPARAM, LPARAM);

in t iCurrentColor = IDC_BLACK, iCurrentFigure = IDC_RECT;

in t iCurrenBrush = IDC_HS_BDIAGONAL;

void PaintWindow(HWND hwnd, int iColor, int iFigure, int iBrush) {

static COLORREF crColor[8] = { RGB(0, 0, 0), RGB(0, 0, 255), RGB(0, 255, 0), RGB(0, 255, 255), RGB(255, 0, 0), RGB(255, 0, 255), RGB(255, 255, 0), RGB(255, 255, 255)} ;

HBRUSH hBrash,hbrush;

HDC hdc ; RECT rect;

hdc = GetDC (hwnd);

GetClientRect (hwnd, &rect);

if(iBrush==IDC_HS_BDIAGONAL)

hbrush=CreateHatchBrush(HS_BDIAGONAL, crColor[iColor-IDC_BLACK]);

if(iBrush == IDC_HS_CROSS)

hbrush=CreateHatchBrush(HS_CRO SS, crColor[iColor - IDCJBLACK]);

if(iBrush == IDC_HS_DIAGCROSS)

hbrush=CreateHatchBrush(HS_DIAGCROSS, crColor[iColor - IDCJBLACK]);

if(iBrash == IDC_HS_FDIAGONAL)

hbrush=CreateHatchBrush(HS_FDIAGONAL, crColor[iColor - IDCJ3LACK]);

if(iBrash == IDC_HS_HORIZONTAL)

hbrush=CreateHatchBrush(HS_HORIZONTAL,

WINDOWS

crColor[iColor - IDCJBLACK]);

if(iBrush == IDC_HS_VERTICAL)

hbrush=CreateHatchBrush(HS_BDIAGONAL, crColor[iColor - IDC JBLACK]);

hBrush = (HBRUSH) SelectObject (hdc, hbrush);

if (iFigure == IDC_RECT)

Rectangle (hdc, rect.left, rect.top, rect.right, rect.bottom);

else

Ellipse(hdc, rect.left, rect.top, rect.right, rect.bottom);

D eleteO bject (SelectObject (hdc, hB rush));

ReleaseDC (hwnd, h d c );

}

void PaintTheBlock(HWND hCữl, int iColor, int iFigure, int iBrush) {

InvalidateRect (hCtrl, NULL, TRUE);

U pdateW indow (hC trl);

PaintWindow (hCtrl, iColor, iFigure,iBrush);

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM IParam)

{

static HINSTANCE hlnstance;

PAINTSTRUCT p s ; switch (message) {

case WM_CREATE:

WINDOWS

hlnstance = ((LPCREATESTRUCT) lParam)->hInstance ; return 0 ;

case WM_COMMAND:

switch (LO W O RD (wParam)) {

case IDC_SHOW:

if (DialogBox (hlnstance, TEXT ("DIALOG"), hwnd, DialogProc)) InvalidateRect (hwnd, NULL, TRUE);

return 0 ; }

break;

case WMJPAINT:

BeginPaint (hwnd, &ps);

EndPaint (hwnd, &ps);

PaintW indow (hwnd, iCurrentColor, iCurrentFigure, iCurrenBrush);

return 0 ;

case WM_DESTROY:

P ostQ uitM essage ( 0 ) ; re tu rn 0 ;

}

re tu rn D efW indow Proc (hwnd, message, wParam, IParam );

}

BOOL CALLBACK DialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM IParam)

{

static HW ND hC trlB lock;

WINDOWS

static in t iColor, iFigure,iBrush;

switch (message) {

case W M JN IT D IALOG : iColor = iCurrentColor ; iFigure = iCurrentFigure ; iBrush = iCurrenBrush;

CheckRadioButton(hDlg,IDC_BLACK,IDC_W HITE, iColor);

CheckRadioButton(hDlg,IDC_RECT,IDC_ELLIPSE,iFigure);CheckRadioButton (hDlg, IDC_HS_BDIAGONAL, IDC_HS_VERTICAL, iBrush);

hCtrlBlock = G etD lgltem (hDlg, IDC_PAINT) ; SetFocus (GetDlgltem (hDlg, iColor)) ; re tu rn FALSE ;

case WM_COMMAND:

switch (LO W ORD (wParam)) {

case IDOK:

iCurrentColor = iColor ; iCurrentFigure = iFigure ; iCurrenBrush = iBrush;

EndDialog (liDlg, TRUE) ; return TRUE ;

case IDCANCEL:

EndDialog (hDlg, FALSE) ; return TRUE ;

case IDCJBLACK:

WINDOWS

case IDC_RED:

case IDC_GREEN:

case IDC_YELLOW:

case IDC_BLUE:

case IDC_MAGENTA:

case IDC_CYAN:

case IDC_WHITE:

iColor = LOWORD (wParam);

CheckRadioButton (hDlg, I D C _ B L A C K , IDCJWHITE, LOWORD (wParam));

PaintTheB lock (hCtrlBlock, iColor, ¡Figure,iB rush);

return TRUE;

case IDC_RECT:

case IDC_ELLIPSE:

¡Figure = LOWORD (wParam);

C heckR adioB utton (hDlg, IDCJRJECT, IDCJELLIPSE, LO W O R D (w Param ));

PaintTheBlock (hCtrlBlock, iColor, iFigure,iBrash);

re tu rn T R U E ;

case IDCJHSJBDIAGONAL:

case IDC_HS_CROSS:

case IDC_HS_DIAGCROSS:

case IDC_HS_FDIAGONAL:

case IDC_HS_HORIZONTAL:

case IDC_HS_VERTICAL:

iBrush = LOWORD (wParam)

CheckRadioButton(hDlg,IDC_HS_BDIAGONAL,IDC_HS_VERTICAL, LOWORD (wParam)) ;

WINDOWS

PaintT heB lock (hCtrlBlock, iColor, iFigure,iBrush);

NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH c TRÊN

re tu rn T R U E ; }

break;

case WM_PAINT:

PaintTheBlock (hCtrlBlock, iColor, iFigure,iBrash);

break;

}

re tu rn FALSE ; }

Một phần của tài liệu NGÔN NGỮ LẬP TRÌNH WINDOWS (Trang 34 - 41)

Tải bản đầy đủ (PDF)

(204 trang)