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

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

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 5 页
字号:


尽管Windows承揽了许多维护对话框和子窗口控件的工作,它同时也为您提供了各种加入程序代码的方法。前面我们已经看到了在对话框上绘图的方法。您也可以使用前面讨论过的窗口子类别化来改变子窗口控件的操作。

您还可以定义自己的子窗口控件,并将它们用到对话框中。例如,假定您特别不喜欢普通的矩形按键,而倾向于建立椭圆形按键,那么您可以通过注册一个窗口类别,并使用自己编写的窗口消息处理程序处理来自您所建立窗口的消息,从而建立椭圆形按键。在Developer Studio中,您可以在与自订控件相联系的「Properties」对话框中指定这个窗口类别,这将转换成对话框模板中的CONTROL叙述。程序11-3所示的ABOUT3程序正是这样做的。

程序11-3 ABOUT3 

        
ABOUT3.ASM
;MASMPlus 代码模板 - 普通的 Windows 程序代码

.386
.Model Flat, StdCall
Option Casemap :None

Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc

includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
include macro.asm
	
	WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
	PaintTheBlock	PROTO :HWND,:DWORD,:DWORD
	
	IDM_APP_ABOUT    equ		    40001
	IDC_STATIC       equ                -1
.DATA
	szAppName	TCHAR	"About3",0
	szEllip		TCHAR	"EllipPush",0
.DATA?
	hInstance1	HINSTANCE	?
	hCtrlBlock	HWND	?
	iColor		DWORD	?
	iFigure		DWORD	?
.CODE
START:
	invoke GetModuleHandle,NULL
	invoke WinMain,eax,NULL,NULL,SW_SHOWDEFAULT
	invoke ExitProcess,0
WinMain proc hInst:DWORD,hPrevInst:DWORD,szCmdLine:DWORD,iCmdShow:DWORD
	LOCAL wndclass   :WNDCLASSEX
	LOCAL aboutclass :WNDCLASSA
	LOCAL msg  :MSG
	LOCAL hWnd :HWND

	mov wndclass.cbSize,sizeof WNDCLASSEX	
	mov wndclass.style,CS_HREDRAW or CS_VREDRAW	
	mov wndclass.lpfnWndProc,offset WndProc

	mov wndclass.cbClsExtra,0
	mov wndclass.cbWndExtra,0
	
	push hInst
	pop wndclass.hInstance
	
	invoke LoadIcon,hInst,addr szAppName
	mov wndclass.hIcon,eax	
	
	invoke LoadCursor,NULL,IDC_ARROW
	mov wndclass.hCursor,eax	
	
	invoke GetStockObject,WHITE_BRUSH
	mov wndclass.hbrBackground,EAX
	
	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
        
	mov aboutclass.style,CS_HREDRAW or CS_VREDRAW	
	mov aboutclass.lpfnWndProc,offset EllipPushWndProc

	mov aboutclass.cbClsExtra,0
	mov aboutclass.cbWndExtra,0
	
	push hInst
	pop aboutclass.hInstance
	
	mov aboutclass.hIcon,NULL	
	
	invoke LoadCursor,NULL,IDC_ARROW
	mov aboutclass.hCursor,eax	

	mov aboutclass.hbrBackground,COLOR_BTNFACE +1
	
	mov aboutclass.lpszMenuName,NULL
	lea eax,szEllip
	mov aboutclass.lpszClassName,eax

   	invoke RegisterClass,addr aboutclass
	invoke CreateWindowEx,NULL,
			ADDR szAppName, 					;window class name
			CTXT("About Box Demo Program"), 
			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
 		xor	eax,TRUE
 		ret
	.elseif	message == WM_COMMAND
		mov	eax,wParam
		and	eax,0FFFFh
		.if	eax == IDOK
			invoke	EndDialog,hDlg, 0
			mov	eax,TRUE
			ret
		.endif	
	.endif	
	mov	eax,FALSE	
  	ret
AboutDlgProc	endp

EllipPushWndProc	proc	hwnd:HWND,message:UINT,wParam:WPARAM, lParam:LPARAM
       LOCAL    szTxt[40]:TCHAR
       LOCAL	hBrush	  :HBRUSH
       LOCAL	hdc:HDC
       LOCAL	ps:PAINTSTRUCT
       LOCAL	rect:RECT
	
	.if	message==WM_PAINT        
                invoke	GetClientRect,hwnd,addr rect
                
        	invoke	GetWindowText,hwnd,addr szTxt,sizeof szTxt
        	;invoke	MessageBox,hwnd,szTxt,NULL,MB_APPLMODAL
        	invoke	BeginPaint,hwnd,addr ps
                mov	hdc,eax
        	
        	invoke	GetSysColor,COLOR_WINDOW
        	invoke	CreateSolidBrush,eax
                mov	hBrush,eax 
        
        	invoke	SelectObject,hdc, hBrush
                mov	hBrush,eax
                
        	invoke	GetSysColor,COLOR_WINDOW
                invoke  SetBkColor,hdc, eax
                
        	invoke	GetSysColor,COLOR_WINDOWTEXT
                invoke  SetTextColor,hdc, eax
                
                invoke  Ellipse,hdc, rect.left, rect.top, rect.right, rect.bottom
        
		invoke  DrawText,hdc,addr szTxt, -1, addr rect,DT_SINGLELINE or DT_CENTER or DT_VCENTER
        
        	invoke	SelectObject,hdc, hBrush
        	invoke	DeleteObject,eax
        
		invoke	EndPaint,hwnd,addr ps
        
        	xor	eax,eax
                ret
        
          .elseif message == WM_KEYUP 
        
                  .if (wParam == VK_SPACE)
                  	jmp	@f
        	  .endif
          .elseif message == WM_LBUTTONUP
        	@@:
        	push	hwnd
        	invoke	GetWindowLong,hwnd, GWL_ID
        	push	eax
        	push	WM_COMMAND
        	invoke	GetParent,hwnd
        	push	eax
        	call	SendMessage        
                xor	eax,eax
                ret
            .endif    
               
           invoke	DefWindowProc,hwnd, message, wParam, lParam
           ret
EllipPushWndProc 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	hInstance1,eax

		xor	eax,eax
		ret			

	.elseif uMsg == WM_COMMAND
		mov	eax,wParam
		and	eax,0FFFFh
		.if	eax == IDM_APP_ABOUT
			invoke	DialogBoxParam,hInstance1, CTXT ("AboutBox"), hwnd,addr AboutDlgProc,0
                        xor	eax,eax
                        ret
		.endif

		.elseif uMsg == WM_DESTROY
	        invoke 	PostQuitMessage,NULL
	        xor	eax,eax
	        ret
	.endif

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


#include "resource.h"

#define IDM_APP_ABOUT 40001
#define IDC_STATIC -1

ABOUTBOX DIALOG DISCARDABLE 32, 32, 180, 100
STYLE DS_MODALFRAME | WS_POPUP
FONT 8, "MS Sans Serif"
BEGIN
CONTROL "OK",IDOK,"EllipPush",WS_GROUP | WS_TABSTOP,73,79,32,14
ICON "ABOUT3",IDC_STATIC,7,7,20,20
CTEXT "About3",IDC_STATIC,40,12,100,8
CTEXT "About Box Demo Program",IDC_STATIC,7,40,166,8
CTEXT "(c) Charles Petzold, 1998",IDC_STATIC,7,52,166,8
END

ABOUT3 MENU DISCARDABLE 
BEGIN
POPUP "&Help"
BEGIN
MENUITEM "&About About3...", IDM_APP_ABOUT
END
END

ABOUT3 ICON DISCARDABLE "icon3.ico"

ABOUT3.ICO
 


 



我们所注册的窗口类别叫做「EllipPush」(椭圆形按键)。在Developer Studio的

⌨️ 快捷键说明

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