怎麼用C++寫圖形界面程序?

我說的不是控制台,就是有邊界有框,正常一點的界面


看的人比較多,所以我覺得還是完善一下回答比較好!//2017年10月17日0點28分

這個問題問得非常好,雖然問題中的描述不準確,但我們都知道他想問的問題是什麼意思:就是怎樣用C++寫一個有窗體界面的程序(很有可能是指在Windows下)。先回答一下這個問題,答案在這兒:從WinMain開始

回想當年,我初學C語言的時候,也有這樣的困惑:為啥我寫的程序背景是黑不溜秋的,文字也是一行一行顯示的,而別人寫的程序都帶著界面和按鈕?

這得從何說起呢?

由於我們最常接觸的就是Windows系統中各種帶有窗體的程序,使得很多人誤以為,這就是程序原本的樣子……其實程序原本是沒有界面的,就一堆代碼在CPU里跑,之所以有界面,是因為人類自身的需要。人類發明了一些硬體設備,來展示程序的過程和結果,最常見的就是普通的電腦顯示器。最早我們用一行行的文字來顯示界面,俗稱CLI(就是控制台,終端,命令行這類界面),隨著科技的進步,後來我們發展出了更加人性化的圖形界面,俗稱GUI。但CLI並沒有消失,甚至在某些應用場合,它比GUI方便得多。

其實代碼的本質就是控制硬體,比如在顯示器上顯示一個點,其實是程序對某個硬體進行賦值操作(不同的硬體設備在程序里有著不同的地址,這就是匯流排結構),所以你要在屏幕上畫個點,本質上就是往某個地址上寫個值,簡單來說就是這樣。這個東西也叫作驅動程序。

通過控制屏幕顯示各種各樣不同的點,我們就可以弄出各種圖案,比如窗口啊,按鈕啊,文字啊,圖片啊,2D或者3D動畫啊,這個東西就叫作計算機圖形學。

然而我們在Windows這種操作系統下開發程序,並不用關心怎麼樣去繪製一個窗口或文字,因為已經有人把這部分工作給我們做好了,並且封裝成了一個個的函數或類,俗稱API(應用程序介面),我們只要調用那個函數,告訴操作系統,給我畫個窗口吧,它就屁顛屁顛的去幫你幹活了,就是這麼簡單。

把一堆API打包裝在一起,就變成了庫。

在命令行上面顯示「hello world」和在窗口上顯示「hello world」的區別,只是使用了不同庫中的不同API而已。對於程序員來說,並沒有本質上的區別,僅僅只是調用的函數不一樣。

所以,我們實際開發時,需要學習這些API怎麼用,有哪些特點,這就屬於應用開發的內容了,比如「Windows編程」,「wxWidget應用開發」等等等等……手機軟體開發,也是一樣的原理。所以,學完C++只是第一步,接下來,如何在相應的操作系統環境下開發軟體,還需要學習相應的API。


事實上,Windows到現在也沒有能用的官方的C++ GUI框架。

你以為是開玩笑。但是這確實是事實。

推銷員鮑爾默擔任微軟總裁10年,windows沒有實質性的進步。

建議用第三方的QT。

最爛的編程體驗就是c++配合mfc或者win32 api編程windows桌面程序。你想死的心估計都有了。對比之下用mac你跟玩的一樣就能用oc配合cocoa框架寫出漂亮美觀的gui程序。這是我對win平台最大不滿的地方。


一位VB狗。表示怎麼出來那個黑色框。看起來好牛逼哦。


//代碼來自MSDN,鏈接Module 1. Your First Windows Program (Windows)

#ifndef UNICODE
#define UNICODE
#endif

#include &

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
// Register the window class.
const wchar_t CLASS_NAME[] = L"Sample Window Class";

WNDCLASS wc = { };

wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;

RegisterClass(wc);

// Create the window.

HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
L"Learn to Program Windows", // Window text
WS_OVERLAPPEDWINDOW, // Window style

// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

NULL, // Parent window
NULL, // Menu
hInstance, // Instance handle
NULL // Additional application data
);

if (hwnd == NULL)
{
return 0;
}

ShowWindow(hwnd, nCmdShow);

// Run the message loop.

MSG msg = { };
while (GetMessage(msg, NULL, 0, 0))
{
TranslateMessage(msg);
DispatchMessage(msg);
}

return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, ps);

FillRect(hdc, ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

EndPaint(hwnd, ps);
}
return 0;

}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}


www.gaclib.net


需要安利 @vczh 的gaclib嗎→_→


為什麼「程序」就是「有界面的東西」?


切,命令行才是程序,界面只是個粉骷髏而已。


Qt不謝

一周速成GUI一周速成網路+多線程,嗯很簡單的(笑


別人會告訴你各種*****,例如QT,mfc,WPF.........

或者是迅雷什麼的bolt。

其實我只想推薦你Htmlayout,誰用誰知道。仿個QQ,360什麼的 ,so easy。。


上vulkan啊,爽的不要不要的。


如果這裡不是知乎而是論壇之類的地方,我想說樓上的答主們都被題主帶跑了。正確的回答應該是:除非你明白自己正在做什麼,否則盲目使用c++是得不償失的。


GUI的世界是很複雜的一個體系。雖然從理論上你只要學會操作像素點就行,但實際上我們需要站住前人的肩膀上,看見更大的世界。

首先你要確定自己的系統,然後你要明確自己的需求,最後進行選擇。簡單的介紹一下:

最底層的是顯卡驅動,DOS下是可以直接寫顯存的。第二層是系統API,對於Windows,有gdi(屬於win32)和ddraw(d2d和d3d的基礎);對於Unix,有X-Window和Wayland;對於Mac OS有Carbon和Cocoa;對於IBM的OS/2,我就不清楚了;基本上對於所有有GUI的系統而言,你都可以使用OpenGL。第三層是系統API的封裝,這樣的東西通常稱為圖形庫(如EasyX,Ege等)或界面庫(如DuiLib等),大一點就會成為圖形框架,如C++的MFC,WX,QT,FLTK,GACLib...,Java的Swt和Swing,C#的WPF,....其他還有Tk和Fltk等。

如果你只是簡單的想畫一些幾何元素,可以考慮OpenGL,或一些對GDI的簡單封裝如EasyX和Ege。要加深理解的話,學一下Win32還是有好處的。做開發的話,MFC是不推薦的,推薦QT。至於WPF,了解一下還是有好處的。


對於Windows圖形編程,最需要掌握的一門基礎技術就是GDI,這是整個Windows圖形界面的基石。


你需要一本mfc教程或者qt

→_→~mfc的確挺噁心的。還是qt好


首先糾正一下題主的問題,程序不能「變成」有界面的東西,你所謂的「有界面的東西」屬於一類程序。

看到點贊最多的回答下的評論(對不起請允許我笑一會兒),我幫你百度到了一篇MFC版貪吃蛇教程:手把手教MFC貪吃蛇

順便提醒一下,學MFC的話首先一定要知道程序的入口WinMain函數在哪裡。

當然你也可以學其他的界面編程,比如gtk,qt等。

最後,如果你還有類似的問題比如「怎麼把程序變成能在手機上使用的東西」等,歡迎邀請我。


恕我直言 oier表示會做出界面沒有什麼卵用 黑框框是最漂亮的!


初學編程也和題主一樣,覺得別人的程序怎麼都有界面,看著notepad都很羨慕。覺得別人的那才是程序,有界面酷酷,自己的都是啥呀。現在寫東西能不用界面的就不用,包括給非專業的人,一個輪迴呀。。


大學剛剛學cpp的時候也這麼問過。題主除了了解什麼叫程序,順便學下qt或者遊戲引擎怎麼用。回首我當年提過的類似問題,傻逼透了,我真傻,真的


我給樓主的問題做個主觀限定,就是編寫 windows 程序,然後這個 windows 程序的界面有 common control 組成。換句話說,會通過對話框和用戶交互。對應於 mfc 中的對話框程序。

這樣,比較可能貼近樓主的需求,gui 界面,有簡單的邊,框。

當然不需要 opengl,direct3d,那相當於從 0 開始寫 direct ui 界面。

如果自己寫 direct ui,這成本高到不知道哪裡去了!根本不是普通人搞得起的。

就這,樓主需要學的還挺多的。最需要的基礎,就是 windows 的事件驅動和 windows gui 程序的運作模型。知道,窗口過程等等,學習一定的基本的 common control 的消息介面。會基本操作常用的 common control,例如,文本框,組合框,單選,多選,普通按鈕,進度條,spin,slider,scroll bar 等等。知道如何定義一個數據結構,讓用戶通過對話框讀寫該數據結構完成交互。

這樣,就差不多了。大概需要怎麼說呢,對於具有基本的 c++ 語言基礎,一般來說,一年應該差不多了。


推薦閱讀:

蘋果公司曾使用的 Parallel Design Investigation 具體是什麼設計方法?
在應用程序設計時總會有一個系統設置的項, 為什麼要有這個菜單,設立的目的是什麼?什麼樣的內容應該放在這裡?
Smartisan os是好看,但是,google Material Design一出,Smartisan os的界面設計還有意義嗎?
羅子雄(Pumel)是誰?

TAG:編程 | 用戶界面設計 | C |