注册 登录
编程论坛 C++教室

c++学了很久很久了,现在还面对黑呼呼的界面

e小陌 发布于 2020-12-31 14:16, 3256 次点击
都说c++能做界面,可是我研究了很久都写不出界面!网上差资料都说用QT 等其他软件来写???? c++ 只能写控制台对吧?
13 回复
#2
apull2020-12-31 16:17
VC++了解一下,qt,mfc都是图形界面库,并不是其他软件。
c++只是个工具语言,需要用它做什么就需要相应的类库支持,比如数据库,网络等操作。
#3
rjsp2020-12-31 16:33
c++ 只能写控制台对吧?
不好直接回答“是”或“否”。

操作系统是C/C++写的,QT/MFC也是C/C++写的,OpenGL/DirectX也是C/C++写的,AutoCAD/Photoshop也是C++写的,……。你说C++能不能写图形界面?图形界面最终还是离不开C/C++。
但C/C++自身并不提供GUI接口(图形用户接口)。而C++之所以不提供GUI接口,那是C++认为自身高贵,不应该去做“图形用户接口”等低贱的活儿。
打个比方,C/C++是个设计农用机械的工程师,你问他会不会挖挑粪浇大蒜?他会肯定是会的,毕竟你挑粪浇大蒜用的工具都是他设计的。但他一定不擅长于挑粪浇大蒜,因为挑粪浇大蒜与其本职工作相差太远。

使用C++编写GUI,你可以
a. 使用操作系统提供的APIs。优点是可以写出最完美最精瘦的代码;缺点是需要的知识点太多,编写起来也很麻烦。
b. windows下可以使用MFC。优点是比直接调用系统APIs要简单轻松多了;缺点是MFC已经过时了,M$已经抛弃了它。
c. 使用QT。优点是它的代码可以跨平台,我就用它写过Android上的APP,全部C/C++代码;缺点是……(很多,略,)
d. 其它各种偏门下三滥的手段,比如基于浏览器的



#4
zbjzbj2020-12-31 19:38
如果钟爱MS,用C#写图形界面吧,MFC框架太大。
#5
OpenGLNewer2021-01-08 00:06
自己靠着书上 老师教的研究不出图形界面的,还是得精准的找教程,比如win32教程(用系统API),mfc教程(封装好的MFC API,个人觉得很乱,没有自己一句一句写理得清除) 这种就有图形界面了, 当然也可以OpenGL(真`图形化)
最近学OpenGL给整吐了,没买书,学的都是断断续续的,网上目前没看到好的中文OpenGL入门教程QAQ
#6
cwa99582021-01-08 10:02
你用的是什么版本的C++呢,控制台程序就是黑乎乎的吧,是dos界面。
我也学了很久的C++,用的是vc++软件,想用他做一些别的软件的二次开发程序,按照开发手册写的代码,都是提示找不到头文件。
我感觉学c语言,要有老师带路才可以。自学很难。
现在我只能用vc++做一些窗体界面的程序,像vb一样的,呵呵,这样窗体程序,用vb更简单。
#7
zbjzbj2021-01-08 14:27
回复 6楼 cwa9958
vb程序,对api的调用很多功能达不到,数据多的时候效率也达不到,这就是vc的优势所在。
做二次开发,需要原软件商提供api,而好多是收费的。所以你找不到头文件,可能就没给你api包。
#8
cwa99582021-01-08 16:40
回复 7楼 zbjzbj
谢谢你的回答。
但是那些文件都是存在的,路径也正确。

还在继续研究中...........

[此贴子已经被作者于2021-1-8 16:41编辑过]

#9
时间的熵2021-01-12 22:45
如果从零开始用C/C++写用户界面必然要接触系统底层,同时还需要很多与底层相关的知识。
所以一般都是用已经写好了的界面库完成这些工作,我个人比起臃肿繁杂的Qt、MFC等东西,还是更青睐于一些轻量简洁的库。
SFML库很适合作为你学完C++基础后,进入C++游戏开发(如果你有兴趣的话)领域的第一脚,它实现一个窗口的代码十分简洁:
程序代码:

// SFML图形库
#include "SFML/Graphics.hpp"

int main()
{
    // 创建窗口
    sf::RenderWindow window(sf::VideoMode(800,600),L"测试窗口",sf::Style::Close);
    window.setFramerateLimit(60);

    // 启动窗口主进程
    while(window.isOpen())
    {
        // 遍历窗口事件
        sf::Event e;
        while(window.pollEvent(e))
        {
            // 关闭事件触发窗口关闭
            if(e.type==sf::Event::Closed){ window.close(); }
        }

        // 清洗窗口
        window.clear();
        // 显示窗口
        window.display();
    }
}

另外它也可以与主流的图形库OpenGL配合使用,使用方法就在它们的官网上:
https://www.
,不过都是英文的……
如果你急切的想尝试一些图形编程,可以用用看这个库,它们官网上还有一份教程和可供下载的API文档。(虽然也是英文的……)
希望这个回答能让你对C++编程更感兴趣。
#10
时间的熵2021-01-12 22:59
回复 6楼 cwa9958
文件路径存在,但却提示“找不到头文件”,那可能是你没有配置好工程属性。
VC++一般用的IDE都是Visual Studio,在“解决方案资源管理器”中右键点击你的工程可以查看“属性”一栏,其中“C/C++”的“常规”->“附加包含目录”、“链接器”的“常规”->“附加库目录”需要尤为关注。
你说的问题在“C/C++”->“常规”->“附加包含目录”中填写正确的头文件目录即可解决。
#11
cwa99582021-01-13 10:13
回复 10楼 时间的熵
谢谢!
继续研究一下
#12
Jonny02012021-01-17 01:43
C++ 本身的特性吧, 我觉得就决定了它适合写控制台的, 不适合写界面
写界面, C# 拉框爽爆了, 底层可以调用 C++
#13
时间的熵2021-01-24 14:48
回复 12楼 Jonny0201
操作系统中几乎所有的界面底层都是以C/C++为主的,C#发明出来也只不过是为了实现针对图形应用更简便快捷的开发。
说实话如果不是对计算机底层感兴趣的人的话,确实很难对C++感兴趣
但编程语言这东西说实话并没有什么太大区别,都是为了实现对计算机的控制才被发明出来的!只不过因为有些语言的特性更适合去干某些事罢了:
就比方C/C++适合写底层,C#适合写应用,Lua、Ruby等适合写脚本……

反正说这么多,结论就一句:想干的话,编程语言可以做一切事情!
#14
裂开的闭眼猪2021-02-02 20:32
Windows编程了解一下:)
如果你使用的是Windows,以下是创建一个窗口的代码,你可以在Dev-Cpp或Visual Studio上(不能在线编译)试着编译运行它:
程序代码:
#include<windows.h>        //Windows编程的头文件
LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMessage,WPARAM wParam,LPARAM lParam){
            //Windows中窗口的消息处理函数,LRESULT在winnt.h中定义为long(也就是长整型),
            //CALLBACK指回调函数。该函数的参数意义如下:
            //hWnd:窗口的句柄
            //uMessage:接收的消息。具体的消息会在下面解释
            //wParam和lParam:该消息的具体内容。现在无需理解
    switch(uMessage){
        case WM_PAINT:      //窗口需要重新绘制。
                            //窗口中的动画都是不断绘制的结果。
            HDC hDc;        //创建设备环境句柄。
            PAINTSTRUCT ps; //创建绘制用的结构。
            hDc=BeginPaint(hWnd,&ps);//开始绘制,获取设备环境句柄。
            TextOutA(hDc,10,10,"一个窗口",8);
                            //在窗口hWnd的坐标(10,10)处输出文字。第5个参数是文字的长度。
                            //因为一个汉字占2个字节,所以长度应为8。
            EndPaint(hWnd,&ps);//结束窗口hWnd的绘制。
            return 0;       //结束此消息的处理。
        case WM_DESTROY:    //窗口正在销毁。
            PostQuitMessage(0);//结束消息循环(见下文)。
            return 0;       //结束此消息的处理。
    }
    return DefWindowProcA(hWnd,uMessage,wParam,lParam);
            //因为窗口消息很多,所以Windows提供了此函数来默认处理其他的窗口消息。
}
int WINAPI WinMain                         //Windows程序的开始点。再也不需要main()了
                  (HINSTANCE hInstance,    //该程序的实例句柄
                   HINSTANCE hPrevInstance,//不会用到,也不需解释
                   LPSTR lpCmdLine,        //该程序运行的命令行
                   int nCmdShow){          //该程序窗口的显示方式
    WNDCLASSEXA wndc;                      //窗口的类,用于描述窗口
    wndc.cbSize=sizeof(wndc);              //类的大小
    wndc.style=CS_HREDRAW|CS_VREDRAW;      //只要大小改变就发送WM_PAINT消息,即重新绘制窗口
    wndc.lpfnWndProc=WindowProc;           //窗口消息处理函数的指针
    wndc.cbClsExtra=0;
    wndc.cbWndExtra=0;                     //这两行代码指定没有额外需要使用的内存
    wndc.hInstance=hInstance;              //实例句柄
    wndc.hIcon=LoadIcon(NULL,IDI_APPLICATION);//使用默认应用程序图标
    wndc.hCursor=LoadCursor(NULL,IDC_ARROW);//使用默认的光标
    wndc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//使用白色背景画刷
    wndc.lpszMenuName=NULL;                //我们没有菜单,也就没有菜单名
    wndc.lpszClassName="windowclass";      //类名,随便取一个就行
    wndc.hIconSm=NULL;                     //不提供类的小图标
   
    RegisterClassExA(&wndc);               //注册该窗口类
    HWND hWnd=CreateWindowExA(               //我们要开始创建窗口了
        0,                            //没有扩展样式
        "windowclass",                //类名
        "window",                   //窗口标题
        WS_OVERLAPPEDWINDOW,          //常见的窗口风格
        66,                           //初始X坐标
        66,                           //初始Y坐标
        666,                          //窗口宽度
        666,                         //窗口高度
        NULL,                         //父窗口句柄
        NULL,                         //菜单句柄
        hInstance,                    //又是熟悉的实例句柄
        NULL);                        //用户数据
   
    if(hWnd==NULL)               //Oops,创建窗口失败了
        return -1;

    ShowWindow(hWnd,nCmdShow);       //按照nCmdShow的方式显示hWnd窗口
    UpdateWindow(hWnd);              //更新窗口,即重新绘制
   
    MSG msg;                        //Windows中消息的结构
    while(                          //期待已久的消息循环
      GetMessage(&msg,NULL,0,0)){   //直到窗口销毁才推出循环
        TranslateMessage(&msg);     //为了一些关于键盘的消息,需要转换键盘输入
        DispatchMessage(&msg);      //将消息发送给WindowProc
    }
    return msg.wParam;              //返回消息的具体信息
}

代码可能会有一点难,不过我可以给你推荐一本书,即《Windows程序设计》,里面详细地讲解了Windows程序。
希望这些能帮助你

[此贴子已经被作者于2021-2-2 20:34编辑过]

1