主题:请教高手:在工具条的按钮中, 如何使用自定义的位图?
==== 1. 问题 ==============================
(1) 在工具条的按钮中, 如何使用自定义的位图 (不想使用HINST_COMMCTRL), 和如何使用自定义字串?或者需要先制作ImageList,如何制作、如何使用?
(2) 在资源文件中定义的Menu、Accelerators、Icon、String资源可调用出, 但Bitmap调用不出来, 不知何因
(3) 在文本框(Edit控件)中, 如何具有Password风格, 即字符只显示为 *****
(4) 在状态条(StatusBar)中, 如何使字串居中
==== 2. 原文件 ==============================
---- (1) 资源文件使用的定义文件 <MyCode.h> --
#define idMenu 0x1000
#define idMenuOpen 0x1001
#define idMenuSave 0x1002
#define idMenuExit 0x1003
#define idAcceKey 0x1010
#define idIcon 0x1020
#define idBmp1 0x1030
#define idBmp2 0x1031
#define idStr1 0x1041
#define idStr2 0x1042
---- (2) 资源文件 <MyCode.RC> ---------------
#include "c:\masm32\INCLUDE\Resource.h"
#include "MyCode.h"
/*----菜单----*/
idMenu MENU DISCARDABLE
BEGIN
POPUP "&File "
BEGIN
MENUITEM "Open", idMenuOpen
MENUITEM "Save", idMenuSave
MENUITEM "Exit", idMenuExit
END
END
/*----加速键----*/
idAcceKey ACCELERATORS
BEGIN
VK_F2, idMenuOpen, VIRTKEY
VK_F3, idMenuSave, VIRTKEY
END
/*----图标----*/
idIcon1 ICON MOVEABLE PURE LOADONCALL DISCARDABLE "D:\Prog\Ico\Ico32-16\Filer.Ico"
/*----位图----*/
idBmp1 BITMAP DISCARDABLE "D:\Prog\Bmp\File.bmp"
idBmp2 BITMAP DISCARDABLE "D:\Prog\Bmp\View.bmp"
161 BITMAP DISCARDABLE "D:\Prog\Bmp\open.bmp"
162 BITMAP DISCARDABLE "D:\Prog\Bmp\CLock.bmp"
/*----字串----*/
STRINGTABLE DISCARDABLE
BEGIN
idStr1 "String1\0"
idStr2 "String2\0"
END
---- (3) 原代码文件 <MyCode.Asm> ------------
.586
;.Model flat, StdCall
Option CaseMap: none
Include c:\Masm32\include\Kernal32.INC
Include c:\Masm32\include\User32.INC
Include c:\Masm32\include\Comctl32.INC
IncludeLib c:\masm32\lib\Kernal32.lib
IncludeLib c:\masm32\lib\User32.lib
IncludeLib c:\masm32\lib\Comctl32.lib
.Const
ID_Menu EQU 1000H
ID_MenuOpen EQU 1001H
ID_MenuSave EQU 1002H
ID_MenuExit EQU 1003H
ID_AcceKey EQU 1010H
ID_Icon EQU 1020H
ID_Bmp1 EQU 1030H
ID_Bmp2 EQU 1031H
ID_Bmp3 EQU 1032H
ID_Str1 EQU 1041H
ID_Str2 EQU 1042H
ID_TOOLBAR EQU 1
.Data
mdhInst DD 0
mdhWnd DD 0
mdhMenu DD 0
mdhToolBar DD 0
mdhStatus DD 0
mdhStatic DD 0
mdhEdit DD 0
mdhMainIco DD 0
mdhBitmap DD 0
mszAppName DB "App", 0
mszClassName DB "App0", 0
mszClassStatic DB "STATIC", 0
mszClassEdit DB "Edit", 0
;--- Toolbar ------
NUM_BUTTONS EQU 6
mauToolbar DB 0
TBBUTTON <0, 0, 0, TBSTYLE_SEP, 0,0,-1>
TBBUTTON <STD_FILEOPEN, ID_Bmp1, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0,0,-1>
TBBUTTON <STD_FILESAVE, ID_Bmp2, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0,0,-1>
TBBUTTON <0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0,0,-1>
TBBUTTON <STD_FIND, ID_Bmp3, TBSTATE_ENABLED, TBSTYLE_CHECK, 0,0,-1>
TBBUTTON <0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0,0,-1>
;--- Status -------
SBCount EQU 4
SBWidth_0 EQU 100
SBWidth_1 EQU 100
SBWidth_2 EQU 100
mdnSbWidth DD 0
DD 100
DD 200
DD 300
DD -1
.Code
start:
Invoke FindWindow, Addr mszClassName, NULL
TEST EAX, EAX
JNZ Exit
Invoke GetModuleHandle, NULL
MOV mdhInst, EAX
Invoke InitCommonControls
Invoke WinMain, mdhInst, NULL, NULL, SW_SHOWDEFAULT
Exit:
Invoke ExitProcess, EAX
WinMain PROC tdhInst:DWORD, tdhPrevInst:DWORD, CmdLine:DWORD, CmdShow:DWORD
Local luWC:WNDCLASSEX
Local luMsg:MSG
Local @hAcceKey
Invoke RtlZeroMemory, Addr luWC, SizeOf WNDCLASSEX
Invoke RtlZeroMemory, Addr luMsg, SizeOf MSG
;---- 装入资源 ---------------------------
Invoke LoadMenu, tdhInst, ID_Menu
MOV mdhMenu, EAX
Invoke LoadIcon, tdhInst, ID_Icon
MOV mdhMainIco, EAX
;---- 注册窗口类 -----------------------------
MOV luWC.cbSize, SizeOf WNDCLASSEX
MOV luWC.style, CS_BYTEALIGNWINDOW ;CS_HREDRAW OR CS_VREDRAW OR CS_BYTEALIGNWINDOW ;NULL
MOV luWC.lpfnWndProc, Offset WndProc
MOV luWC.cbClsExtra, NULL
MOV luWC.cbWndExtra, NULL
PUSH tdhInst
POP luWC.hInstance
MOV luWC.hbrBackground, 10H
MOV luWC.lpszMenuName, NULL
MOV luWC.lpszClassName, Offset mszClassName
MOV EAX, mdhMainIco
MOV luWC.hIcon, EAX ; 标题栏图标
MOV luWC.hIconSm, EAX ; 标题栏图标
Invoke LoadCursor, NULL, IDC_ARROW
MOV luWC.hCursor, EAX
Invoke RegisterClassEx, Addr luWC
;---- 建立输出窗口 ---------------------------
Invoke GetSystemMetrics, SM_CXSCREEN
Invoke CreateWindowEx, WS_EX_ACCEPTFILES, Addr mszClassName, Addr mszAppName, \
WS_OVERLAPPEDWINDOW OR WS_EX_WINDOWEDGE OR WS_EX_CLIENTEDGE, \ ; +WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_VISIBLE, \
0, 0, 300, 200, \
NULL, mdhMenu, tdhInst, NULL
MOV mdhWnd, EAX
;---- 补充装入资源 --------------------------
Invoke LoadAccelerators, tdhInst, ID_AcceKey
MOV @hAcceKey, EAX
Invoke LoadBitmap, tdhInst, ID_Bmp1
Invoke SendMessage, mdhWnd, STM_SETIMAGE, ID_Bmp1, EAX
;---- 显示窗口 ---------------------------
Invoke ShowWindow, mdhWnd, SW_SHOWNORMAL
Invoke UpdateWindow, mdhWnd
;---- 消息循环 -------------------------------
.While TRUE
Invoke GetMessage, Addr luMsg, NULL, 0, 0
.Break .If EAX == 0
Invoke TranslateAccelerator, mdhWnd, @hAcceKey, Addr luMsg
.If EAX == 0
Invoke TranslateMessage, Addr luMsg
Invoke DispatchMessage, Addr luMsg
.Endif
.Endw
MOV EAX, luMsg.wParam
RET
WinMain ENDP
WndProc PROC tdhWnd:DWORD, tdnMsg:DWORD, tdnWParam:DWORD, tdnLParam:DWORD
.If tdnMsg == WM_CREATE
;-- Toolbar ----------------------
Invoke S_FrmTbInit, tdhWnd
;-- ImageList --------------------
; Invoke ImageList_Create,24,24,
;-- Static -----------------------
Invoke CreateWindowEx, NULL, Offset mszClassStatic, NULL, \
WS_CHILD OR WS_VISIBLE OR WS_BORDER OR WS_TABSTOP, \
20, 60, 100, 30, \
tdhWnd, 0, mdhInst, NULL
MOV mdhStatic, EAX
;-- Edit -------------------------
Invoke CreateWindowEx, NULL, Offset mszClassEdit, NULL, \
WS_CHILD OR WS_VISIBLE OR WS_BORDER OR WS_TABSTOP, \
130, 60, 100, 30, \
tdhWnd, 0, mdhInst, NULL
MOV mdhEdit, EAX
; Invoke SendMessage, mdhEdit, WM_SETFONT, mdhFontSong10, 1
;-- Statusbar ----------------------
Invoke CreateStatusWindow, WS_CHILD OR WS_VISIBLE OR SBS_SIZEGRIP, 0, tdhWnd, 200
MOV mdhStatus, EAX
Invoke SendMessage, mdhStatus, SB_SETPARTS, 6, Offset mdnSbWidth
Invoke SendMessage, mdhStatus, SB_SETBKCOLOR, 0, 0E0FFFFh
; Invoke SendMessage, mdhStatus, WM_SETFONT, mdhFontSong10, 1
.ElseIf tdnMsg == WM_COMMAND
.ElseIf tdnMsg == WM_NOTIFY
.Elseif tdnMsg == WM_DROPFILES
.ElseIf tdnMsg == WM_MOUSEMOVE
.ElseIf tdnMsg == WM_LBUTTONUP
.ElseIf tdnMsg == WM_SIZE
;.ElseIf tdnMsg == WM_PAINT
;.ElseIf uMsg == WM_CLOSE
.ElseIf tdnMsg == WM_DESTROY
Invoke PostQuitMessage, NULL
.Else
Invoke DefWindowProc, tdhWnd, tdnMsg, tdnWParam, tdnLParam
RET
.EndIf
XOR EAX, EAX
RET
WndProc ENDP
S_FrmTbInit PROC tdhWnd:DWORD
Local tbb:TBBUTTON
Invoke CreateToolbarEx, tdhWnd,\
WS_VISIBLE or WS_CHILD or TBSTYLE_FLAT or TBSTYLE_TOOLTIPS or CCS_ADJUSTABLE,\
ID_TOOLBAR, \
5, HINST_COMMCTRL, IDB_STD_LARGE_COLOR,
Offset mauToolbar + 1, NUM_BUTTONS, \
24, 24, 24, 24, \
Sizeof TBBUTTON
MOV mdhToolBar, EAX
Invoke ShowWindow, mdhToolBar, SW_SHOW
Invoke LoadBitmap, mdhInst, ID_Bmp1
MOV tbb.iBitmap, EAX
MOV tbb.fsStyle, TBSTYLE_BUTTON
MOV tbb.idCommand, ID_Bmp3
Invoke SendMessage, mdhToolBar, TB_ADDBITMAP, 3, Addr tbb
XOR EAX, EAX
RET
S_FrmTbInit ENDP
End start
(1) 在工具条的按钮中, 如何使用自定义的位图 (不想使用HINST_COMMCTRL), 和如何使用自定义字串?或者需要先制作ImageList,如何制作、如何使用?
(2) 在资源文件中定义的Menu、Accelerators、Icon、String资源可调用出, 但Bitmap调用不出来, 不知何因
(3) 在文本框(Edit控件)中, 如何具有Password风格, 即字符只显示为 *****
(4) 在状态条(StatusBar)中, 如何使字串居中
==== 2. 原文件 ==============================
---- (1) 资源文件使用的定义文件 <MyCode.h> --
#define idMenu 0x1000
#define idMenuOpen 0x1001
#define idMenuSave 0x1002
#define idMenuExit 0x1003
#define idAcceKey 0x1010
#define idIcon 0x1020
#define idBmp1 0x1030
#define idBmp2 0x1031
#define idStr1 0x1041
#define idStr2 0x1042
---- (2) 资源文件 <MyCode.RC> ---------------
#include "c:\masm32\INCLUDE\Resource.h"
#include "MyCode.h"
/*----菜单----*/
idMenu MENU DISCARDABLE
BEGIN
POPUP "&File "
BEGIN
MENUITEM "Open", idMenuOpen
MENUITEM "Save", idMenuSave
MENUITEM "Exit", idMenuExit
END
END
/*----加速键----*/
idAcceKey ACCELERATORS
BEGIN
VK_F2, idMenuOpen, VIRTKEY
VK_F3, idMenuSave, VIRTKEY
END
/*----图标----*/
idIcon1 ICON MOVEABLE PURE LOADONCALL DISCARDABLE "D:\Prog\Ico\Ico32-16\Filer.Ico"
/*----位图----*/
idBmp1 BITMAP DISCARDABLE "D:\Prog\Bmp\File.bmp"
idBmp2 BITMAP DISCARDABLE "D:\Prog\Bmp\View.bmp"
161 BITMAP DISCARDABLE "D:\Prog\Bmp\open.bmp"
162 BITMAP DISCARDABLE "D:\Prog\Bmp\CLock.bmp"
/*----字串----*/
STRINGTABLE DISCARDABLE
BEGIN
idStr1 "String1\0"
idStr2 "String2\0"
END
---- (3) 原代码文件 <MyCode.Asm> ------------
.586
;.Model flat, StdCall
Option CaseMap: none
Include c:\Masm32\include\Kernal32.INC
Include c:\Masm32\include\User32.INC
Include c:\Masm32\include\Comctl32.INC
IncludeLib c:\masm32\lib\Kernal32.lib
IncludeLib c:\masm32\lib\User32.lib
IncludeLib c:\masm32\lib\Comctl32.lib
.Const
ID_Menu EQU 1000H
ID_MenuOpen EQU 1001H
ID_MenuSave EQU 1002H
ID_MenuExit EQU 1003H
ID_AcceKey EQU 1010H
ID_Icon EQU 1020H
ID_Bmp1 EQU 1030H
ID_Bmp2 EQU 1031H
ID_Bmp3 EQU 1032H
ID_Str1 EQU 1041H
ID_Str2 EQU 1042H
ID_TOOLBAR EQU 1
.Data
mdhInst DD 0
mdhWnd DD 0
mdhMenu DD 0
mdhToolBar DD 0
mdhStatus DD 0
mdhStatic DD 0
mdhEdit DD 0
mdhMainIco DD 0
mdhBitmap DD 0
mszAppName DB "App", 0
mszClassName DB "App0", 0
mszClassStatic DB "STATIC", 0
mszClassEdit DB "Edit", 0
;--- Toolbar ------
NUM_BUTTONS EQU 6
mauToolbar DB 0
TBBUTTON <0, 0, 0, TBSTYLE_SEP, 0,0,-1>
TBBUTTON <STD_FILEOPEN, ID_Bmp1, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0,0,-1>
TBBUTTON <STD_FILESAVE, ID_Bmp2, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0,0,-1>
TBBUTTON <0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0,0,-1>
TBBUTTON <STD_FIND, ID_Bmp3, TBSTATE_ENABLED, TBSTYLE_CHECK, 0,0,-1>
TBBUTTON <0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0,0,-1>
;--- Status -------
SBCount EQU 4
SBWidth_0 EQU 100
SBWidth_1 EQU 100
SBWidth_2 EQU 100
mdnSbWidth DD 0
DD 100
DD 200
DD 300
DD -1
.Code
start:
Invoke FindWindow, Addr mszClassName, NULL
TEST EAX, EAX
JNZ Exit
Invoke GetModuleHandle, NULL
MOV mdhInst, EAX
Invoke InitCommonControls
Invoke WinMain, mdhInst, NULL, NULL, SW_SHOWDEFAULT
Exit:
Invoke ExitProcess, EAX
WinMain PROC tdhInst:DWORD, tdhPrevInst:DWORD, CmdLine:DWORD, CmdShow:DWORD
Local luWC:WNDCLASSEX
Local luMsg:MSG
Local @hAcceKey
Invoke RtlZeroMemory, Addr luWC, SizeOf WNDCLASSEX
Invoke RtlZeroMemory, Addr luMsg, SizeOf MSG
;---- 装入资源 ---------------------------
Invoke LoadMenu, tdhInst, ID_Menu
MOV mdhMenu, EAX
Invoke LoadIcon, tdhInst, ID_Icon
MOV mdhMainIco, EAX
;---- 注册窗口类 -----------------------------
MOV luWC.cbSize, SizeOf WNDCLASSEX
MOV luWC.style, CS_BYTEALIGNWINDOW ;CS_HREDRAW OR CS_VREDRAW OR CS_BYTEALIGNWINDOW ;NULL
MOV luWC.lpfnWndProc, Offset WndProc
MOV luWC.cbClsExtra, NULL
MOV luWC.cbWndExtra, NULL
PUSH tdhInst
POP luWC.hInstance
MOV luWC.hbrBackground, 10H
MOV luWC.lpszMenuName, NULL
MOV luWC.lpszClassName, Offset mszClassName
MOV EAX, mdhMainIco
MOV luWC.hIcon, EAX ; 标题栏图标
MOV luWC.hIconSm, EAX ; 标题栏图标
Invoke LoadCursor, NULL, IDC_ARROW
MOV luWC.hCursor, EAX
Invoke RegisterClassEx, Addr luWC
;---- 建立输出窗口 ---------------------------
Invoke GetSystemMetrics, SM_CXSCREEN
Invoke CreateWindowEx, WS_EX_ACCEPTFILES, Addr mszClassName, Addr mszAppName, \
WS_OVERLAPPEDWINDOW OR WS_EX_WINDOWEDGE OR WS_EX_CLIENTEDGE, \ ; +WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_VISIBLE, \
0, 0, 300, 200, \
NULL, mdhMenu, tdhInst, NULL
MOV mdhWnd, EAX
;---- 补充装入资源 --------------------------
Invoke LoadAccelerators, tdhInst, ID_AcceKey
MOV @hAcceKey, EAX
Invoke LoadBitmap, tdhInst, ID_Bmp1
Invoke SendMessage, mdhWnd, STM_SETIMAGE, ID_Bmp1, EAX
;---- 显示窗口 ---------------------------
Invoke ShowWindow, mdhWnd, SW_SHOWNORMAL
Invoke UpdateWindow, mdhWnd
;---- 消息循环 -------------------------------
.While TRUE
Invoke GetMessage, Addr luMsg, NULL, 0, 0
.Break .If EAX == 0
Invoke TranslateAccelerator, mdhWnd, @hAcceKey, Addr luMsg
.If EAX == 0
Invoke TranslateMessage, Addr luMsg
Invoke DispatchMessage, Addr luMsg
.Endif
.Endw
MOV EAX, luMsg.wParam
RET
WinMain ENDP
WndProc PROC tdhWnd:DWORD, tdnMsg:DWORD, tdnWParam:DWORD, tdnLParam:DWORD
.If tdnMsg == WM_CREATE
;-- Toolbar ----------------------
Invoke S_FrmTbInit, tdhWnd
;-- ImageList --------------------
; Invoke ImageList_Create,24,24,
;-- Static -----------------------
Invoke CreateWindowEx, NULL, Offset mszClassStatic, NULL, \
WS_CHILD OR WS_VISIBLE OR WS_BORDER OR WS_TABSTOP, \
20, 60, 100, 30, \
tdhWnd, 0, mdhInst, NULL
MOV mdhStatic, EAX
;-- Edit -------------------------
Invoke CreateWindowEx, NULL, Offset mszClassEdit, NULL, \
WS_CHILD OR WS_VISIBLE OR WS_BORDER OR WS_TABSTOP, \
130, 60, 100, 30, \
tdhWnd, 0, mdhInst, NULL
MOV mdhEdit, EAX
; Invoke SendMessage, mdhEdit, WM_SETFONT, mdhFontSong10, 1
;-- Statusbar ----------------------
Invoke CreateStatusWindow, WS_CHILD OR WS_VISIBLE OR SBS_SIZEGRIP, 0, tdhWnd, 200
MOV mdhStatus, EAX
Invoke SendMessage, mdhStatus, SB_SETPARTS, 6, Offset mdnSbWidth
Invoke SendMessage, mdhStatus, SB_SETBKCOLOR, 0, 0E0FFFFh
; Invoke SendMessage, mdhStatus, WM_SETFONT, mdhFontSong10, 1
.ElseIf tdnMsg == WM_COMMAND
.ElseIf tdnMsg == WM_NOTIFY
.Elseif tdnMsg == WM_DROPFILES
.ElseIf tdnMsg == WM_MOUSEMOVE
.ElseIf tdnMsg == WM_LBUTTONUP
.ElseIf tdnMsg == WM_SIZE
;.ElseIf tdnMsg == WM_PAINT
;.ElseIf uMsg == WM_CLOSE
.ElseIf tdnMsg == WM_DESTROY
Invoke PostQuitMessage, NULL
.Else
Invoke DefWindowProc, tdhWnd, tdnMsg, tdnWParam, tdnLParam
RET
.EndIf
XOR EAX, EAX
RET
WndProc ENDP
S_FrmTbInit PROC tdhWnd:DWORD
Local tbb:TBBUTTON
Invoke CreateToolbarEx, tdhWnd,\
WS_VISIBLE or WS_CHILD or TBSTYLE_FLAT or TBSTYLE_TOOLTIPS or CCS_ADJUSTABLE,\
ID_TOOLBAR, \
5, HINST_COMMCTRL, IDB_STD_LARGE_COLOR,
Offset mauToolbar + 1, NUM_BUTTONS, \
24, 24, 24, 24, \
Sizeof TBBUTTON
MOV mdhToolBar, EAX
Invoke ShowWindow, mdhToolBar, SW_SHOW
Invoke LoadBitmap, mdhInst, ID_Bmp1
MOV tbb.iBitmap, EAX
MOV tbb.fsStyle, TBSTYLE_BUTTON
MOV tbb.idCommand, ID_Bmp3
Invoke SendMessage, mdhToolBar, TB_ADDBITMAP, 3, Addr tbb
XOR EAX, EAX
RET
S_FrmTbInit ENDP
End start