小白问一下关于c++的windows界面编程的问题

问题描述

小白问一下关于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里都有一种叫“对话框”资源的东西,可以创建一个对话框,虽说是对话框,但与普通界面无异,不要拘
泥于这是一个对话框还是窗口

时间: 2024-12-14 12:58:35

小白问一下关于c++的windows界面编程的问题的相关文章

Windows界面编程(2) 半透明窗体

上一篇<Windows界面编程第一篇 位图背景与位图画刷>介绍了通过WM_CTLCOLORDLG消息来来设置对话框的背景以及位图画刷的使用.本篇将介绍动态调节窗体透明度的方法. 调节窗体透明度可以先使用SetWindowLong为窗体加上WS_EX_LAYERED属性,再使用来SetLayeredWindowAttributes指定窗体的透明度.这样就可以在程序运行时动态的调节窗体的透明度了. 下面先介绍下SetWindowLong和SetLayeredWindowAttributes函数.

Windows界面编程(1) 位图背景与位图画刷

可以通过WM_CTLCOLORDLG消息来设置对话框的背景,MSDN上对这个消息的说明如下: The WM_CTLCOLORDLG message is sent to a dialog box before the system draws the dialog box. By responding to this message, the dialog box can set its text and background colors using the specified display

windows编程-初学Windows界面编程看什么书合适?

问题描述 初学Windows界面编程看什么书合适? 初学Windows界面编程看什么书合适?主要想做界面,和按键消息处理方面的编程,谢谢大神们! 解决方案 java GUI应用程序设计或者java+eclipse的书籍,要看你用什么语言 解决方案二: java GUI应用程序设计或者java+eclipse的书籍,要看你用什么语言 解决方案三: 你想走哪方面?有很多种,C# .NET WPF目前貌似比较火.qt也可以考虑,是跨平台的.还有就是MFC,现在在走下坡路,再就是win32,比较底层,后

Windows界面编程第七篇 文件拖拽(文件拖放)

本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5128654 转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8634451 欢迎关注微博:http://weibo.com/MoreWindows   前面已经有六篇文章介绍了Windows界面编程,目录如下: 1. <Windows界面编程第一篇位图背景与位图画刷> 2. <Windows界面编程

界面-本人小白问个android的问题

问题描述 本人小白问个android的问题 大概是这样的在一个按钮的onclick里面写了个这个 for(int i = 0:i<10:i++){ 控件.layout(控件.getLeft()+1,控件.getTop()+1,控件.getRight()-1,控件.getBottom()-1): 控件.invalidate(); log("*****,"~~~"): 延时: } logcat里是显示了十次, 但界面上为什么看起来还是只绘制最后一次移动了啊? 对不起,本人新

indows编程-我想问一下,该选择哪种界面编程?

问题描述 我想问一下,该选择哪种界面编程? 我学了C和C++.最近一直在看<windows程序设计>,练习GUI编程,但是发现 用API写程序太麻烦了,效率好低,写个代码还要查半天资料,百分之八十的时间都 花在码代码而不是思考上面了.能推荐一个好用的封装么?我不知道QT和MFC谁更好用.效率谁更高,或者还有其他的一些?谢谢啦. 解决方案 我的个人感觉QT简单些 API写窗口,虽然代码比较多,但是执行效率很高. 解决方案二: AIP运算快,好用 解决方案三: QT肯定要比MFC好很多的. 建议学

最新版Windows界面将恢复“开始”按钮

硅谷网6月4日消息 微软在最新版Windows界面恢复了"开始"按钮,并提供简装版和其他一连串改进,希望以此赢得平板电脑用户市场,并让传统个人电脑(PC)用户更能接受Windows8. 微软正在寻求再次掀起最新版Windows的销售热潮,后者在电脑用户中的反响不及微软当初的预期.该公司高管称,公司计划未来定期更新Windows产品,不需再如之前等待 三年左右才推出重大http://www.aliyun.com/zixun/aggregation/6453.html">升

c语言-C语言:小白问一个问题

问题描述 C语言:小白问一个问题 代码如下 #include void search(float (*p)[4],int n) { int i,j,k; for(i=0;i<n;i++) { k=0; for(j=0;j<4;j++) if(*(*(p+i)+j)<60) k=1; if(k==1) { printf("the falied student numbers are No.%d ",i+1); for(j=0;j<4;j++) printf(&qu

android小白问一个故障

问题描述 android小白问一个故障 android小白,做一个很简单的动作,第一个activity里面输入的内容传递到第二个activity的textview中去,但是报错如下 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object ref