⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 见招拆招《windows程序设计》(十) .txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 5 页
字号:
	
	lea eax,szAppName
	mov wndclass.lpszMenuName,eax
	mov wndclass.lpszClassName,eax

	mov wndclass.hIconSm,0
	
	invoke RegisterClassEx, ADDR wndclass
	.if (eax==0)
	   invoke MessageBox,NULL,CTXT("This program requires Windows NT!"),szAppName, MB_ICONERROR
           ret
	.endif
        
   
	invoke CreateWindowEx,NULL,
			ADDR szAppName, 					;window class name
			CTXT("No-Popup Nested Menu Demonstration"), 
			WS_OVERLAPPEDWINDOW,					;window style
			CW_USEDEFAULT,						;initial x position
			CW_USEDEFAULT,						;initial y position
			CW_USEDEFAULT, 						;initial x size
			CW_USEDEFAULT,						;initial y size
			NULL,							;parent window handle
			NULL,							;window menu handle
			hInst,							;program instance handle
			NULL										;creation parameters
	mov hWnd,eax

  	invoke ShowWindow,hWnd,iCmdShow
	invoke UpdateWindow,hWnd

	StartLoop:
		invoke GetMessage,ADDR msg,NULL,0,0
			cmp eax, 0
			je ExitLoop
				invoke TranslateMessage, ADDR msg
				invoke DispatchMessage,  ADDR msg
			jmp StartLoop
	ExitLoop:
	
	mov eax,msg.wParam
	ret
WinMain endp

AboutDlgProc	proc hDlg:HWND,message:UINT,wParam:WPARAM,lParam:LPARAM
	.if	message == WM_INITDIALOG
		mov	eax,iCurrentColor
		mov	iColor,eax
		
		mov	eax,iCurrentFigure
		mov	iFigure ,eax
		
                invoke	CheckRadioButton,hDlg, IDC_BLACK, IDC_WHITE,   iColor
		invoke	CheckRadioButton,hDlg, IDC_RECT,  IDC_ELLIPSE, iFigure
                invoke	GetDlgItem,hDlg, IDC_PAINT
                mov	hCtrlBlock,eax
                invoke	GetDlgItem ,hDlg, iColor
 		invoke	SetFocus,eax
 		mov	eax,FALSE
 		ret
	.elseif	message == WM_COMMAND
		mov	eax,wParam
		and	eax,0FFFFh
		.if	eax == IDOK
			mov	eax,iColor
			mov	iCurrentColor,eax
		
			mov	eax,iFigure
			mov	iCurrentFigure ,eax			
			invoke	EndDialog,hDlg, TRUE
			mov	eax,TRUE
			ret
			
		.elseif	eax==IDCANCEL
			invoke	EndDialog,hDlg,FALSE
			mov	eax,TRUE
			ret
		.elseif	(eax==IDC_BLACK)|| \
			(eax==IDC_RED)|| \
			(eax==IDC_GREEN)|| \
			(eax==IDC_YELLOW)|| \
			(eax==IDC_BLUE)|| \
			(eax==IDC_MAGENTA)|| \
			(eax==IDC_CYAN)|| \			
			(eax==IDC_WHITE)
			mov	eax,wParam
			and	eax,0FFFFh
			mov	iColor,eax
			invoke  CheckRadioButton,hDlg, IDC_BLACK, IDC_WHITE, eax
			invoke  PaintTheBlock,hCtrlBlock,iColor,iFigure
        		mov	eax,TRUE
        		ret
		.elseif	(eax==IDC_RECT)|| \
			(eax==IDC_ELLIPSE)
			mov	eax,wParam
			and	eax,0FFFFh
			mov	iFigure ,eax
			invoke	CheckRadioButton,hDlg, IDC_RECT, IDC_ELLIPSE, eax
			invoke	PaintTheBlock,hCtrlBlock,iColor,iFigure
			mov	eax,TRUE
			ret
		.endif	
	.elseif	message == WM_PAINT
		invoke	PaintTheBlock,hCtrlBlock,iColor,iFigure
	.endif	
	mov	eax,FALSE	
  	ret
AboutDlgProc	endp

PaintWindow	proc	hwnd:HWND,iCl:DWORD,iPt:DWORD
       LOCAL	hBrush:HBRUSH
       LOCAL	hdc:HDC
       LOCAL	rect:RECT
       
       invoke	GetDC,hwnd
       mov      hdc,eax
       invoke	GetClientRect,hwnd,addr rect
       ; invoke	MessageBox,hwnd,CTXT("XXX"),NULL,MB_APPLMODAL
        
       mov	eax,iCl
       sub	eax,IDC_BLACK
       shl	eax,2
       mov	eax,crColor[eax]
       invoke	CreateSolidBrush,eax
       mov	hBrush,eax

       invoke	SelectObject,hdc, hBrush
       mov	hBrush,eax
       
       .if (iFigure == IDC_RECT)
                invoke	Rectangle,hdc, rect.left, rect.top, rect.right, rect.bottom
       .else
		invoke	Ellipse,hdc, rect.left, rect.top, rect.right, rect.bottom
	.endif	
	invoke	SelectObject,hdc, hBrush
	invoke	DeleteObject,eax
	invoke	ReleaseDC,hwnd, hdc
        ret
PaintWindow	endp

PaintTheBlock	proc hCtrl:HWND,iCl:DWORD,iFg:DWORD
        invoke	InvalidateRect,hCtrl, NULL, TRUE
        invoke	UpdateWindow,hCtrl
        invoke	PaintWindow,hCtrl,iCl,iFg
        ret
PaintTheBlock	endp

WndProc proc hwnd:DWORD,uMsg:DWORD,wParam :DWORD,lParam :DWORD
	LOCAL	ps:PAINTSTRUCT
	
	.if	uMsg == WM_CREATE
		mov	esi,lParam
		mov	eax,[esi+4]
		mov	hInstance,eax

		xor	eax,eax
		ret			
	.elseif uMsg == WM_COMMAND
		mov	eax,wParam
		and	eax,0FFFFh
		.if	eax == IDM_APP_ABOUT
			invoke	DialogBoxParamA,hInstance, CTXT ("AboutBox"), hwnd,addr AboutDlgProc,0
			.if (eax !=0)
                        	invoke	InvalidateRect,hwnd, NULL, TRUE
                        .endif	
                        xor	eax,eax
                        ret
		.endif
	.elseif uMsg == WM_PAINT
		invoke	BeginPaint,hwnd,addr ps
		invoke	EndPaint,hwnd,addr ps
		invoke	PaintWindow,hwnd, iCurrentColor,iCurrentFigure
	        xor	eax,eax
	        ret	        
	.elseif uMsg == WM_DESTROY
	        invoke 	PostQuitMessage,NULL
	        xor	eax,eax
	        ret
	.endif

	invoke DefWindowProc,hwnd,uMsg,wParam,lParam
	ret
WndProc endp
END START
ABOUT2.RC 


#include "resource.h"

#define IDC_BLACK 1000
#define IDC_BLUE 1001
#define IDC_GREEN 1002
#define IDC_CYAN 1003
#define IDC_RED 1004
#define IDC_MAGENTA 1005
#define IDC_YELLOW 1006
#define IDC_WHITE 1007
#define IDC_RECT 1008
#define IDC_ELLIPSE 1009
#define IDC_PAINT 1010
#define IDM_APP_ABOUT 40001

ABOUTBOX DIALOG DISCARDABLE 32, 32, 200, 234
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
FONT 8, "MS Sans Serif"
BEGIN
ICON "ABOUT2",IDC_STATIC,7,7,20,20
CTEXT "About2",IDC_STATIC,57,12,86,8
CTEXT "About Box Demo Program",IDC_STATIC,7,40,186,8
LTEXT "",IDC_PAINT,114,67,72,72
GROUPBOX "&Color",IDC_STATIC,7,60,84,143
RADIOBUTTON "&Black",IDC_BLACK,16,76,64,8,WS_GROUP | WS_TABSTOP
RADIOBUTTON "B&lue",IDC_BLUE,16,92,64,8
RADIOBUTTON "&Green",IDC_GREEN,16,108,64,8
RADIOBUTTON "Cya&n",IDC_CYAN,16,124,64,8
RADIOBUTTON "&Red",IDC_RED,16,140,64,8
RADIOBUTTON "&Magenta",IDC_MAGENTA,16,156,64,8
RADIOBUTTON "&Yellow",IDC_YELLOW,16,172,64,8
RADIOBUTTON "&White",IDC_WHITE,16,188,64,8
GROUPBOX "&Figure",IDC_STATIC,109,156,84,46,WS_GROUP
RADIOBUTTON "Rec&tangle",IDC_RECT,116,172,65,8,WS_GROUP | WS_TABSTOP
RADIOBUTTON "&Ellipse",IDC_ELLIPSE,116,188,64,8
DEFPUSHBUTTON "OK",IDOK,35,212,50,14,WS_GROUP
PUSHBUTTON "Cancel",IDCANCEL,113,212,50,14,WS_GROUP
END



ABOUT2 ICON DISCARDABLE "About2.ico"


ABOUT2 MENU DISCARDABLE 
BEGIN
POPUP "&Help"
BEGIN
MENUITEM "&About", IDM_APP_ABOUT
END
END



ABOUT2.ICO
 


 



ABOUT2中的About框有两组单选按钮。一组用来选择颜色,另一组用来选择是矩形还是椭圆形。所选的矩形或者椭圆显示在对话框内,其内部以目前选择的颜色着色。使用者按下「OK」按钮后,对话框会终止,程序的窗口消息处理程序在它自己的显示区域内绘出所选图形。如果您按下「Cancel」,则主窗口的显示区域会保持原样。对话框如图11-2所示。尽管ABOUT2使用预先定义的标识符IDOK和IDCANCEL作为两个按键,但是每个单选按钮均有自己的标识符,它们以前缀IDC开头(用于控件的ID)。这些标识符在RESOURCE.H中定义。


 



图11-2 ABOUT2程序的对话框
 

当您在ABOUT2对话框中建立单选按钮时,请按显示顺序建立。这能保证Developer Studio依照顺序定义标识符的值,程序将使用这些值。另外,每个单选按钮都不要选中「Auto」选项。「Auto Radio Button」需要的程序代码较少,但基本上处理起来更深奥些。然后请依照ABOUT2.RC中的定义来设定它们的标识符。

选中「Properties」对话框中下列对象的「Group」选项:「OK」和「Cancel」按钮、「Figure」分组方块、每个分组方块中的第一个单选按钮(「Black」和「Rectangle」)。选中这两个单选按钮的「Tab Stop」复选框。

当您有全部控件在对话框中的近似位置和大小时,就可以从「Layout」菜单选择「Tab Order」选项。按ABOUT2.RC资源描述中显示的顺序单击每一个控件。

使用对话框控件


在前面几期,您会发现大多数子窗口控件发送WM_COMMAND消息给其父窗口(唯一例外的是滚动条控件)。您还看到,经由发送消息给子窗口控件,父窗口可以改变子窗口控件的状态(例如,选择或不选择单选按钮、复选框)。您也可以用类似方法在对话框程序中改变控件。例如,如果您设计了一系列单选按钮,就可以发送消息给它们,以选择或者不选择这些按钮。不过,Windows也提供了几种使用对话框控件的简单办法。我们来看一看对话框程序与子窗口控件相互通信的方式。

ABOUT2的对话框模板显示在程序11-2的ABOUT2.RC资源描述档中。GROUPBOX控件只是一个带标题(标题为「Color」或者「Figure」)的分组方块,每组单选按钮都由这样的分组方块包围。前一组的八个单选按钮是互斥的,第二组的两个单选按钮也是如此。

当用鼠标单击其中一个单选按钮时(或者当单选按钮拥有输入焦点时按空格键),子窗口向其父窗口发送一个WM_COMMAND消息,消息的wParam的低字组被设为控件的ID,wParam的高字组是一个通知码,lParam值是控件的窗口句柄。对于单选按钮,这个通知码是BN_CLICKED或者0。然后Windows中的对话框窗口消息处理程序将这个WM_COMMAND消息发送给ABOUT2.C内的对话框程序。当对话框程序收到一个单选按钮的WM_COMMAND消息时,它为此按钮设定选中标记,并为组中其它按钮清除选中标记。

您可能还记得在前面提到过,选中和不选中按钮均需要向子窗口控件发送BM_CHECK消息。要设定一个按钮选中标记,您可以使用:

SendMessage (hwndCtrl, BM_SETCHECK, 1, 0) ;
        
要消除选中标记,您可以使用:

SendMessage (hwndCtrl, BM_SETCHECK, 0, 0) ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -