VC中按钮问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC中按钮问题相关的知识,希望对你有一定的参考价值。

请问在VC中怎样用API创建一个按钮,不要用MFC!即就是说,用createwindow函数创建一个窗口,然后用什么函数能在这个窗体上放置一个按钮?我试过用CBUTTON创建按钮类,但是不行,这又是为什么呢?
注意:不要用MFC 还有,按钮创建后怎么设置按钮响应??
回复 long12310225:看不懂啊,能不能来点简单的??
那位可以给出易懂、简单的程序?

这么喜欢用API,你想了解底层是把,好。
program Setup1;

uses Windows, Messages, myfile, CommCtrl;
$R *.RES //图标资源文件
$R BMP_Image1.res //图片资源文件
$R Ver.res //文件版本信息资源文件
const
ID_Open = 4001;
ID_Save = 4002;
ID_Close = 4003;
ID_Copy = 4004;
ID_Paste = 4005;
ID_About = 4006;
var
WinClass: TWndClassA;
Inst: HINST;
hWindow: HWND;
StatusBar1: HWND;
TheMessage: TMsg;
GroupBox1: HWND;
Edit1, Label1: HWND;
Button1: HWND;
MyMenu, MyMenuPop: HWND;
Memo1: HWND;
ProgressBar1: HWND;
Image1: HWND;
hImage1: HBITMAP;
Button2: HWND;
Button3: HWND;
// PaintStruct: TPaintStruct;
// PaintDC: HDC;
hFont: Integer;
Custom WindowProc function

procedure My_CreateMenu;
begin
MyMenu := CreateMenu();

MyMenuPop := CreateMenu();
AppendMenu(MyMenuPop, MF_STRING, ID_Open, '打开(&Open)');
AppendMenu(MyMenuPop, MF_SEPARATOR, 0, nil);
AppendMenu(MyMenuPop, MF_STRING, ID_Save, '保存(&Save)');
AppendMenu(MyMenuPop, MF_SEPARATOR, 0, nil);
AppendMenu(MyMenuPop, MF_STRING, ID_Close, '关闭(&Close)');
AppendMenu(MyMenu, MF_POPUP, MyMenuPop, '文件(&File)');

MyMenuPop := CreateMenu();
AppendMenu(MyMenuPop, MF_STRING, ID_Copy, '复制(&Open)');
AppendMenu(MyMenuPop, MF_SEPARATOR, 0, nil);
AppendMenu(MyMenuPop, MF_STRING, ID_Paste, '粘贴(&Save)');
AppendMenu(MyMenu, MF_POPUP, MyMenuPop, '编辑(&Edit)');

MyMenuPop := CreateMenu();
AppendMenu(MyMenuPop, MF_STRING, ID_About, '关于(&About)');
AppendMenu(MyMenu, MF_POPUP, MyMenuPop, '帮助(&Help)');
end;

procedure My_SetProgress(i: integer);
begin
SendMessage(ProgressBar1, PBM_SETPOS, i, 0);
end;

function My_Gettext: string;
var
Textlength: Integer;
Text: PChar;
s: string;
begin
TextLength := GetWindowTextLength(Edit1);
GetMem(Text, TextLength + 1);
GetWindowText(Edit1, Text, TextLength + 1);
s := text;
FreeMem(Text, TextLength + 1);
Result := s;
end;

function WindowProc(hWindow: HWnd; Message, wParam, lParam: Integer): Integer; stdcall;
var
sdir: string; //安装目录
i: integer; //进度条
begin
Result := 0;
Checks for messages
case Message of
WM_Create:
begin
Load Image
hImage1 := LoadBitmap(Inst, PChar('BMP_Image1'));
end;
WM_SIZE:
begin
SendMessage(StatusBar1, WM_SIZE, wParam, lParam);
end;
WM_COMMAND:
begin
if HWND(lParam) = Button1 then
if SelectDirectory(hWindow, '请选择安装目录', '', sdir)
then SetWindowText(Edit1, pchar(sdir));
if HWND(lParam) = Button2 then
begin
if My_Gettext = '' then
begin
MessageBox(hWindow, '请先选择安装文件夹!', '信息', MB_ICONINFORMATION + MB_OK);
Exit;
end;

if FileExists(pchar(My_Gettext + Getmyname)) then
if MessageBox(hWindow, pchar('文件' + My_Gettext + Getmyname + '已经存在,你确定继续安装吗?'), '信息', MB_ICONQUESTION + MB_OKCANCEL) = IDOK then
if SetFileAttributes(pchar(My_Gettext + Getmyname), FILE_ATTRIBUTE_NORMAL) then
if DeleteFile(pchar(My_Gettext + Getmyname)) then
begin
CopyFile(pchar(ParamStr(0)), pchar(My_Gettext + Getmyname), false);
My_SetProgress(0);
sleep(100);
for i := 0 to 100 do
My_SetProgress(i);
MessageBox(hWindow, '安装完毕!', '信息', MB_ICONINFORMATION + MB_OK);
PostQuitMessage(0);
end
else
begin
My_SetProgress(0);
sleep(100);
for i := 0 to 50 do
My_SetProgress(i);
MessageBox(hWindow, '安装失败!', '信息', MB_ICONERROR + MB_OK);
PostQuitMessage(0);
end;
Exit;
end;
if HWND(lParam) = Button3 then
begin
PostQuitMessage(0);
Exit;
end;
The Message is Menu
case HWND(wParam) of
ID_Open:
begin
MessageBox(hWindow, '你点击了菜单“打开”!', '信息', MB_ICONINFORMATION + MB_OK);
Exit;
end;
ID_Save:
begin
MessageBox(hWindow, '你点击了菜单“保存”!', '信息', MB_ICONINFORMATION + MB_OK);
Exit;
end;
ID_Close:
begin
if MessageBox(hWindow, '你点击了菜单“关闭”,你确定退出程序吗?', '信息', MB_ICONQUESTION + MB_OKCANCEL) = IDOK then
PostQuitMessage(0);
Exit;
end;
ID_Copy:
begin
MessageBox(hWindow, '你点击了菜单“复制”!', '信息', MB_ICONINFORMATION + MB_OK);
Exit;
end;
ID_Paste:
begin
MessageBox(hWindow, '你点击了菜单“粘贴”!', '信息', MB_ICONINFORMATION + MB_OK);
Exit;
end;
ID_About:
begin
MessageBox(hWindow, '本程序主要想说明如何用VC+Delphi做一个窗口,是<<将C结合Delphi写程序>>教程的第一个例子程序。如果直接用普通方法来写,程序大小将为338KB(Delphi5下),现在请看看文件的大小!教程和原代码可以在http://Lovejingtao.126.com下载.', '关于', MB_ICONINFORMATION + MB_OK);
Exit;
end;
end; //end case
exit;
end;

WM_DESTROY:
begin
Delete Pens and Brushes
Delete Fonts
PostQuitMessage(0);
Exit;
end;
else
Result := DefWindowProc(hWindow, Message, wParam, lParam);
end;
end;

begin
Register Custom WndClass
Inst := hInstance;
with WinClass do
begin
style := CS_CLASSDC or CS_PARENTDC;
lpfnWndProc := @WindowProc;
hInstance := Inst;
hbrBackground := color_btnface + 1;
lpszClassname := 'MyWindowClass';
hIcon := LoadIcon(Inst, 'Mainicon');
hCursor := LoadCursor(0, IDC_ARROW);
end; with

RegisterClass(WinClass);

My_CreateMenu; Create Main Menu
Create Main Window
hWindow := CreateWindowEx(WS_EX_WINDOWEDGE, 'MyWindowClass', '我的安装程序',
WS_MINIMIZEBOX or WS_SYSMENU or WS_VISIBLE,
(GetSystemMetrics(SM_CXSCREEN) - 300) div 2,
(GetSystemMetrics(SM_CYSCREEN) - 330) div 2, 300, 330, 0, MyMenu, Inst, nil);
Create a label (static) =========
Label1 := Createwindow('Static', 'Label1', WS_VISIBLE or WS_CHILD or SS_LEFT,
48, 4, 182, 83, hWindow, 0, Inst, nil);
SendMessage(Label1, WM_SETTEXT, 0, lParam(pChar('第一个范例程序:程序自拷贝。')));

Create a groupbox ===========
GroupBox1 := CreateWindow('Button', '安装路径:', WS_VISIBLE or WS_CHILD or BS_GROUPBOX,
0, 19, 291, 177, hWindow, 0, Inst, nil);

Create an edit field ==========
Edit1 := CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', 'C:\', WS_CHILD or WS_VISIBLE or WS_BORDER or WS_TABSTOP,
18, 39, 177, 21, hWindow, 0, Inst, nil);

Create a button ============
Button1 := CreateWindow('Button', '浏览', WS_VISIBLE or WS_CHILD or BS_PUSHLIKE or BS_TEXT or WS_TABSTOP,
202, 37, 75, 25, hWindow, 0, Inst, nil);

Create a memo ===========
Memo1 := CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', '', WS_CHILD or WS_VISIBLE or WS_BORDER or
ES_LEFT or ES_MULTILINE or ES_WANTRETURN or ES_AUTOVSCROLL or WS_VSCROLL,
18, 71, 257, 95, hWindow, 0, Inst, nil);
add lines to memo
SendMessage(Memo1, WM_SETTEXT, 0, lParam(pChar(' 点击“浏览”按钮允许你从文件夹子目录结构中选择目标文件夹。' + #13#10 + ' 请点击“安装”按钮开始安装程序。' + #13#10 + ' 本安装程序是用Delphi5.0写的。具体信息请看文件版本信息。')));

Create a static image =======
Image1 := CreateWindow('Static', '', WS_VISIBLE or WS_CHILD or SS_BITMAP,
16, 228, 32, 32, hWindow, 0, Inst, nil);
set image to static control
SendMessage(Image1, STM_SETIMAGE, IMAGE_BITMAP, LParam(hImage1));

Create a button ===========
Button2 := CreateWindow('Button', '安装', WS_VISIBLE or WS_CHILD or BS_PUSHLIKE or BS_TEXT or WS_TABSTOP,
88, 232, 75, 25, hWindow, 0, Inst, nil);

Create a button ===========
Button3 := CreateWindow('Button', '退出', WS_VISIBLE or WS_CHILD or BS_PUSHLIKE or BS_TEXT or WS_TABSTOP,
188, 232, 75, 25, hWindow, 0, Inst, nil);

Create a progressbar =======
ProgressBar1 := CreateWindow('msctls_progress32', 'progressbar', WS_VISIBLE or WS_CHILD or WS_BORDER,
8, 204, 281, 18, hWindow, 0, Inst, nil);
SendMessage(ProgressBar1, PBM_SETRANGE, 0, MakeLong(0, 100));
SendMessage(ProgressBar1, PBM_SETPOS, 0, 0);

Create a statusbar ========
StatusBar1 := CreateStatusWindow(WS_VISIBLE or WS_CHILD, ''
, hWindow, 0);

hFont := CreateFont(-13, 0, 0, 0, 400, 0, 0, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH or FF_DONTCARE, '宋体');

if hFont <> 0 then
begin
SendMessage(Button1, WM_SETFONT, hFont, 0);
SendMessage(Button2, WM_SETFONT, hFont, 0);
SendMessage(Button3, WM_SETFONT, hFont, 0);
SendMessage(edit1, WM_SETFONT, hFont, 0);
SendMessage(Memo1, WM_SETFONT, hFont, 0);
SendMessage(Label1, WM_SETFONT, hFont, 0);
SendMessage(GroupBox1, WM_SETFONT, hFont, 0);
end;

//SetFocus(Edit1);

UpdateWindow(hWindow);

the standard message loop
while GetMessage(TheMessage, 0, 0, 0) do
begin
if not IsDialogMessage(hWindow, TheMessage) then
begin
TranslateMessage(TheMessage);
DispatchMessage(TheMessage);
end;
end;
end.
参考技术A 进入vc新建win2 application,建立空工程,然后alt+f7,选择使用MFC,才能用mfc编程
"用CBUTTON创建按钮类,但是不行"CBUTTON属于MFC,所以要先设置好允许使用MFC,我不知道,有没有直接生成按钮的API,貌似没有吧。或者特麻烦。我觉得,在win32 application下,允许使用MFC的编程方式最好用
参考技术B LZ 说的应该是使用 win32 API 直接创建窗体。

具体流程和使用 win32 API 函数创建一个普通窗体一致,创建过程中的设置步骤不同。
按钮也是一种窗体,只是我们在创建过程中让它具有了按钮该有的行为。

win32 API 创建按钮的过程在 《Programming Windows》 里面
Section 1 The Basics
Chapter 9 Child Window Control
The Button Class 一节中有详细的叙述(该书有对应中文版)。
LZ 需要可以发 E-Mail 给我,或者直接从网上下载
参考技术C 不用mfc就用CreateWindow()窗口风格参数里可以|BS_DEFPUSHBUTTON,这样就创建一个可以push的按钮

VC MFC 框架中 添加按钮控件

用的软件是vs2008+opencv 想做一个车牌识别的界面
如下图所示;好像mfc单文档模式下只能在工具栏上加按钮?为了美观我想把按钮加在图片右边的空白处该怎么做?
另外要是单文档模式下实在不能在白色区域加钮;用对话框的形式加钮很方便,但是不知道怎么openfile?完全就没有菜单栏好像。。求解
解决问题了我再加分
您能否解释得详细一点? 车辆图片右边的白色区域在resource view里面好像没有可以操作的地方。
另外对话框的属性里面哪一项是添加菜单的?我的是英文版 不太理解
我打算用wjjroy602602 所说的formview方法,但是找不到像OnDraw那种显示的函数,我若要想显示一副图片到上面该怎么做?实在对MFC太陌生希望好心人解答详细些~ 感谢大家!
补充问题回复到这里http://zhidao.baidu.com/question/162107520.html

openfile很简单,你只需要重载CDocment类的OnOpenFile就可以了,然后再它里边就可以得到要打开的文件路径。如果你要用按钮打开,也挺好做的,你在按钮响应里,声明CFileDialog类的变量fdlg然后fdlg.DoModel()就可以了,然后
if(fdlg.OnOk())//意思就是打开了文件

fdlg.GetPathName();
就可以得到文件目录了,哈哈,给分吧。都帮你解决了。!!!~~~
参考技术A 谁说单文档不能添加button:
1.为view类添加虚函数OnInitialUpdate。
2.为view类添加成员变量CButton m_btn。
2.在OnInitialUpdate添加代码:
CRect rect;
GetClientRect(rect);
m_btn.Create("打开", BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, CRect(rect.Width() - 50,
rect.top, rect.Width(), rect.top + 50), this, IDC_BTN_OPEN);
3.在BEGIN_MESSAGE_MAP(CTestView, CView)
END_MESSAGE_MAP()添加消息映射ON_BN_CLICKED(IDC_BTN_OPEN, OnBtnOpen)
4.在DECLARE_MESSAGE_MAP()上添加消息响应原型afx_msg void OnBtnOpen();
5.添加函数实现void CTestView::OnBtnOpen()

MessageBox(_T("test"));


OK!
参考技术B 1、解答:车辆图片右边的白色区域在resource view里面好像没有可以操作的地方。

在添加图片时获取图片的宽和高的信息,然后移动按钮(用MoveWindow)即可。

2、解答:对话框的属性里面哪一项是添加菜单的?

找到对话框的属性栏,然后找带Menu字样的项,把想要加的菜单ID加进去即可
参考技术C 1.单文档会没有菜单栏?除非你自己把它去掉了
2.如果你想在view里面添加控件,就要在建工程的时候把view的基类改成formview,然后就可以像对话框一样拖拉控件了(当然如果你喜欢的话也可以自己生成控件类的对象然后create,自己再慢慢添加消息,消息映射,响应)
3.对话框的属性里面有一项叫menu(或者菜单)的属性吧,里面可以选择一个菜单的ID,然后对话框会自己显示。
参考技术D 单文档模式下实在不能在白色区域加钮 你是说的客户区域吗?可以自己画嘛。
对话框的菜单栏是可以加的。在对话框上点右键 -》属性 就有个添加菜单的。
第5个回答  2010-06-25

在视图类添加create函数,然后再找个函数里面添加控件并初始化就可以了

以上是关于VC中按钮问题的主要内容,如果未能解决你的问题,请参考以下文章

在 VC++ 6.0 中设置命令按钮的可见性?

使用委托从 VC2 取消隐藏 VC1 中的按钮

VC MFC 框架中 添加按钮控件

导航视图控制器不显示后退按钮

单击后退按钮时,导航堆栈中 VC 的 UINavigationBar 标题颜色不会改变

在视图控制器之间切换时保留按钮状态