问题描述
- 小白问一下关于c++的windows界面编程的问题
-
本人刚刚开始自学windows界面编程,用的编译器是vs2012。问了同学决定从winform入手,但是刚开始就被这些头文件啊源文件啊什么的给搞晕了。本来打算今晚写出来一个程序,但是一直在纠结这个参数传递,下面先上代码,非常简单的一个程序。
解决方案
你用winforms就要按照winforms的来,首先,不同于你在学校学的那个C++,winforms有自己的程序入口,无需再写main函数。
你新建了一个窗口,直接放上去按钮、文本框(用于输入),双击按钮,直接把代码写在按钮的事件处理函数中就可以了。
如果你希望定义一个变量让下次点击按钮还起作用,就定义成窗体的成员变量。
C++开发winforms程序已经不算标准的C++了,因为这种程序只有VS/VC.NET能编译,并且需要.net框架支持才能运行,微软扩展了一些语法,比如^符号,在标准C++里面没有的。
与其用C++ CIL,不如直接用C#,更简单。
解决方案二:
```#include "MyForm.h"
#include
#include
#include
using namespace std;
int main(){
srand(time(0));
string a;
int g = rand() % 3;
if (g == 0)
a = "肯定啦!";
else a = "当然啦!";
}
这是cpp文件
解决方案三:
第一次上csdn问答有点紧张。。不太清楚具体规则,就在这里上代码看能不能成功吧。。
下面是cpp文件
#include "MyForm.h"
#include
#include
#include
using namespace std;
int main(){
srand(time(0));
string a;
int g = rand() % 3;
if (g == 0)
a = "肯定啦!";
else a = "当然啦!";
}
下面是头文件
#pragma once
namespace exercise {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// MyForm 摘要
/// </summary>
public ref class MyForm : public System::Windows::Forms::Form
{
public:
MyForm(void)
{
InitializeComponent();
//
//TODO: 在此处添加构造函数代码
//
}
protected:
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
~MyForm()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Button^ button1;
protected:
private:
/// <summary>
/// 必需的设计器变量。
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
///
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
///
void InitializeComponent(void)
{
this->button1 = (gcnew System::Windows::Forms::Button());
this->SuspendLayout();
//
// button1
//
this->button1->Location = System::Drawing::Point(146, 65);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(121, 62);
this->button1->TabIndex = 0;
this->button1->Text = L"我帅吗";
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);
//
// MyForm
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(432, 224);
this->Controls->Add(this->button1);
this->Name = L"MyForm";
this->Text = L"MyForm";
this->Load += gcnew System::EventHandler(this, &MyForm::MyForm_Load);
this->ResumeLayout(false);
}
#pragma endregion
private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) {
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
MessageBoxButtons buttons = MessageBoxButtons::OK;
MessageBox::Show(a, "你说呢", buttons);
}
};
}
主要问题就在头文件里面MessageBox的show函数这里,我想让他显示一个变量,这个变量在cpp里面才有定义,我想问问怎么实现。。今晚本来有成功过的,但是忘记保存了。。
解决方案四:
最好是能将头文件里面MessageBox的show函数的实现搞到 cpp 文件中
如果你实在不想搞,就需要在头文件中外部引用 cpp 中的变量。在 C 语言中,是用 extern 关键字。
解决方案五:
严重警告:使用托管C++开发程序不是主流!!!!
托管C++就像一个怪物,很少有人使用它做项目开发。
建议:桌面开发主要是两种方式:(1)C++结合Win32API或MFC (2)C#/VB.net结合WinForm开发。
解决方案六:
我觉得使用C++做界面编程,MFC才是核心,你这种自创建Form几乎没人会这么用。MFC提供了各种类型的Form界面和控件,大小树形等都可以简单的设定。
界面布局主要是是熟悉坐标系的设定,比如屏幕坐标,视图坐标,相对坐标,绝对坐标等等,这些都有固定的模式,你的关注点应该放在Form的运行机制,
就是消息模式。从最简单的成员添加,消息添加等等。最简单的是一般的模态对话框CDialog,其次还有非模态对话框,视图对话框FormView等等。
总的来说主要是四个方面:Form类型,Form本身自带的虚函数和消息函数,控件(及其对应的成员变量),控件响应的消息
解决方案七:
先学win32吧,再学MFC,一点一点来。
解决方案八:
花多眼乱的,我略表愚见。
标题是“c++的windows界面编程”,往下看到winform就呆住了,倒是去查了一下。
想必楼主看到了最大字的“严重警告:使用托管C++开发程序不是主流!!!!”了吧,可能你还不懂什么意思,还有人提到MFC,你可能更晕!
新建项目
CLR指的就是托管C++;很明显写着MFC的自然就是MFC;Win32是最基础的,但想弄出好效果是最不容易的
以上三种封装性递减,封装性越高,用起来越方便,但局限就越大,想自定义一些特殊的效果会比较难,适用的平台越少,对操作系
统的依赖越大。
分点概述其利弊,好坏和用哪种自己判断吧:
(1)CLR即托管C++:介于C#和标准C++之间的特殊品种。标准C++指的是完全遵循C++标准规定的语法的C++程序设计;
C#则是在一种托管的语言,它遵循了C/C++的不少语法,但是也有很多不同,最主要的是基于在Windows上编程的需要而做出了
大量的封装,比起标准C++方便。所以CLR就是混合两者的产物,既绝大部分支持了标准C++的语法,但又同时支持C#形式的语
法和他的封装库。你的winform就是这里面的东西。但是C#也好,CLR C++也好,都是基于.Net的,也就是运行于FrameWork
组件下的托管语法,只能在Windows且是装了相应版本FrameWork的Windows下运行,而且理论上来说效率比标准C++慢一点。
FrameWork必须要安装至少是相同版本的,如果没有,你的程序根本运行不起来,而如果你想发布的时候连FrameWork一起带上
劝你打消了这个年头,FrameWork安装包40M,你自己的程序没有500M你也不好意思带上它啊,网络安装包也有5M
总结:方便,容易控制;但可运行的平台少,局限大
(2)MFC,许多人用MFC做界面,MFC不需要FrameWork支持,本身就在C++运行库中,而C++运行库4-5M,这就是完整的了。
MFC是对Windows API的封装,Windows提供API作为Windows提供的各种功能的接口,生成界面(更准确是创建窗口,绘制界面
效果)也是其中之一。MFC中对界面封装的主要包括GDI系列的函数和Windows标准控件,可以用这些来生成你自己的界面。相对来
说还是比较麻烦的,而且也是只能在Windows上运行,但是对Windows的版本的要求低了,也没有了对FrameWork的要求。而且
MFC有一部分内部代码还是可以看到的,这有助于我们了解MFC是怎么工作的,更好地去使用他们。
总结:封装性比CLR低,Windows版本限制低,无FrameWork依赖;但比较麻烦,不过通过自绘可以创建自定义的效果
(3)Win32:最底层的,很多人学了控制台之后就没碰过它了。Win32控制台项目确实是最简单的c++项目类型,然后想用Win32项
目创建界面那我就只能呵呵了,如果打算用CreateWindow函数去创建各个控件,写代码去管理他们,确实是很麻烦的。他没有MFC
的封装,只能乖乖去调用API,而很多API虽然功能强大,但是细节很多,不容易运用,用好了就是高手了,用不好就一塌糊涂。同样,
Win32也只是依赖C++运行库就可以了。有决心研究API,学的深入的可以选择这个。
总结:运行平台的问题不严重,XP到Win8都不会出什么大问题,无FrameWork依赖;但很麻烦。
最后说一点,MFC和Win32里都有一种叫“对话框”资源的东西,可以创建一个对话框,虽说是对话框,但与普通界面无异,不要拘
泥于这是一个对话框还是窗口