新聞中心
Linux是一種自由、開放源代碼的操作系統(tǒng),使用非常廣泛。盡管Linux操作系統(tǒng)本身并不支持窗口圖形界面,但是我們可以使用一些工具和框架來在Linux中創(chuàng)建窗口,這方面最主要的工具就是X Window。

創(chuàng)新互聯(lián)建站云計算的互聯(lián)網(wǎng)服務(wù)提供商,擁有超過13年的服務(wù)器租用、聯(lián)通機(jī)房服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗,已先后獲得國家工業(yè)和信息化部頒發(fā)的互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務(wù)許可證。專業(yè)提供云主機(jī)、虛擬主機(jī)、主機(jī)域名、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
一、什么是X Window
X Window是一種用于顯示圖形界面的系統(tǒng),它是基于客戶端/服務(wù)器架構(gòu)的。在Linux操作系統(tǒng)中,X Window通常稱為X11。X Window系統(tǒng)包括三個主要組件:服務(wù)器、客戶端和窗口管理器。X Window服務(wù)器運(yùn)行在Linux操作系統(tǒng)上,接收來自客戶端的請求并顯示反饋。客戶端是應(yīng)用程序,它們通過向服務(wù)器發(fā)送請求來顯示窗口。
窗口管理器是一種特殊的客戶端,它有兩個主要功能:管理窗口和控制窗口的外觀和感覺。常用的窗口管理器有GNOME、KDE、Xfce等。
二、如何在Linux上安裝X Window
如果你使用的是Ubuntu,可以使用以下命令來安裝X Window:
“`sudo apt-get install x-window-system“`
如果你使用的是其他Linux發(fā)行版,可以使用以下命令來查看是否已經(jīng)安裝了X Window:
“`which startx“`
如果輸出結(jié)果為/usr/bin/startx,則說明X Window已經(jīng)安裝。否則,你需要使用適當(dāng)?shù)拿顏戆惭b它。
三、如何在Linux上創(chuàng)建窗口
在Linux中創(chuàng)建窗口的過程與在其他操作系統(tǒng)中創(chuàng)建窗口類似。您需要使用合適的編程語言和框架來創(chuàng)建窗口。在Linux中,常用的框架有GTK+、Qt、Tk等。
1、使用GTK+創(chuàng)建窗口
GTK+是一個流行的開源工具包,用于創(chuàng)建圖形用戶界面。它是GNOME桌面環(huán)境的默認(rèn)工具包,因此在Linux中很常見。要在Linux中創(chuàng)建GTK+窗口,請遵循以下步驟:
– 安裝GTK+
在Ubuntu中,可以使用以下命令安裝GTK+:
“`sudo apt-get install libgtk-3-dev“`
如果你使用的是其他Linux發(fā)行版,請使用適當(dāng)?shù)拿顏戆惭b它。
– 編寫GTK+窗口程序
以下代碼演示了如何使用GTK+創(chuàng)建一個簡單的窗口:
“`#include
int mn (int argc, char *argv[])
{
GtkWidget *window;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), “Hello World”);
gtk_widget_show (window);
gtk_mn ();
return 0;
}
“`
該程序使用gtk_window_new函數(shù)創(chuàng)建一個名為window的新窗口。然后,使用gtk_window_set_title函數(shù)設(shè)置窗口標(biāo)題。使用gtk_widget_show函數(shù)來顯示窗口,gtk_mn函數(shù)用于等待事件的發(fā)生。
– 編譯GTK+程序
使用以下命令將程序編譯為可執(zhí)行文件:
“`gcc -o window window.c `pkg-config –cflags –libs gtk+-3.0“`
要運(yùn)行新創(chuàng)建的窗口,請使用以下命令:
“`./window“`
2、使用Qt創(chuàng)建窗口
Qt是一個跨平臺的框架,用于創(chuàng)建圖形用戶界面。它可以在Linux、Windows和macOS等操作系統(tǒng)中使用。要在Linux上使用Qt創(chuàng)建窗口,請遵循以下步驟:
– 安裝Qt
在Ubuntu中,可以使用以下命令安裝Qt:
“`sudo apt-get install qt5-default“`
如果你使用的是其他Linux發(fā)行版,請使用適當(dāng)?shù)拿顏戆惭bQt。
– 編寫Qt窗口程序
以下代碼演示了如何使用Qt創(chuàng)建一個簡單的窗口,其中使用了QApplication和QMnWindow:
“`#include
#include
int mn(int argc, char *argv[])
{
QApplication app(argc, argv);
QMnWindow window;
window.resize(250, 150);
window.setWindowTitle(“Hello World”);
window.show();
return app.exec();
}
“`
該程序使用QMnWindow類創(chuàng)建一個名為window的新窗口。然后,使用resize函數(shù)設(shè)置窗口的大小,使用setWindowTitle函數(shù)設(shè)置窗口標(biāo)題。使用show函數(shù)來顯示窗口,app.exec()函數(shù)用于等待事件的發(fā)生。
– 編譯Qt程序
使用以下命令將程序編譯為可執(zhí)行文件:
“`qmake -project
qmake
make“`
要運(yùn)行新創(chuàng)建的窗口,請使用以下命令:
“`./window“`
四、
在Linux中創(chuàng)建窗口需要使用適當(dāng)?shù)墓ぞ吆涂蚣埽鏧 Window、GTK+、Qt等。每種工具和框架都有不同的優(yōu)缺點,可根據(jù)您的特定需求和偏好選擇。
相關(guān)問題拓展閱讀:
- 嵌入式軟件和信息終端軟件是什么?
- 如何用C語言開發(fā)窗體應(yīng)用程序。。
嵌入式軟件和信息終端軟件是什么?
1 嵌入式Linux系統(tǒng)
嵌入式系統(tǒng)是以應(yīng)用為中心,以計算機(jī)技術(shù)為基礎(chǔ),并且軟硬件可裁減。適用于用戶系統(tǒng)對功能、可靠性、成本、體積、功耗有嚴(yán)格要求的專用計算機(jī)系統(tǒng)。從20世紀(jì)80年代末開始,陸續(xù)出現(xiàn)了一些嵌入式操作系統(tǒng),如VxWorks、pSOS、WindowsCE、Linux等。其中免費(fèi)源代碼的Linux操作系統(tǒng)因其內(nèi)核小、支持多種硬件平臺、可裁減性好等顯著優(yōu)點,得到了廣泛的關(guān)注,為嵌入式系統(tǒng)開發(fā)提供了一個極有力的選擇。
信息終端軟件開發(fā)
本系統(tǒng)中采用了MiniGUI專為嵌入式系統(tǒng)開發(fā)的Lite版本。它基于客戶/服務(wù)器(C/S)體系,在服務(wù)器和客戶之間傳遞輸入設(shè)備數(shù)據(jù),以及客戶和服務(wù)器之間的某些語法 和響應(yīng)數(shù)據(jù)。
在該信息終端軟件中,就根據(jù)這種結(jié)構(gòu)特點,設(shè)計了一個服務(wù)器程序和兩個客戶進(jìn)程。服務(wù)器始終運(yùn)行后臺,記錄有關(guān)系統(tǒng)信息,如系統(tǒng)計時、用戶刷卡余額等,通過MiniGUI提供的Socket機(jī)制通信將數(shù)據(jù)傳給下面的客戶程序。主界面客戶進(jìn)程給用戶提供了完整的操作體驗,用戶可以通過菜單選擇打、瀏覽信息等功能。另一客戶進(jìn)程則是廣告屏保,在無人使用的間隙時間里,可以動態(tài)顯示一些精彩的畫面,實現(xiàn)商業(yè)價值或公益宣傳。下面分別進(jìn)行介紹。
(1)信息終端客戶程序
該信息終端主體界面客戶程序在MiniGUI服務(wù)器的控制臺程序下打開,彈出的是信息終端的主菜單,顯示了、信息查詢、城市交通、新聞專欄等板塊。
程序?qū)崿F(xiàn)時,開始是包含的頭文件。
MiniGUI圖形包的頭文件茄和寬有:common.h(MiniGUI常用的宏及數(shù)據(jù)類型的定義)、minigui.h(全局的和通用的接口函數(shù)及雜項函數(shù)的定義)、window.h(定義了和窗口有關(guān)的宏、數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)和窗口函數(shù))。使用GDI函數(shù)和控件還需包括gdi.h、control.h兩個頭文件。
編程實現(xiàn)時,MiniGUI的程序入口點是MiniGUIMain函數(shù),系統(tǒng)初始化后就會自動找到該函數(shù)。在該函數(shù)中先設(shè)置主窗口一些基本屬性,建立每個客戶程序唯一的一個消息隊列。當(dāng)程序結(jié)束時,調(diào)用MainWindow ThreadCleanup函數(shù),清除主窗口所使用的消息隊列系統(tǒng)資源,退回服務(wù)器程序中。
其各個功能子函數(shù)是在MiniGUI程序的另一主體部分——主界面窗口的過程函數(shù)中調(diào)用打開的。在主窗口建立時,其中有一項屬性MainWindowProc,即是注明了對應(yīng)該窗口的過程函數(shù)。各個功能顫亮模塊的消息也都是通過主窗口中的消息循環(huán)進(jìn)行觸發(fā)的。
窗口過程函數(shù)主體上都是switch和case結(jié)構(gòu)的選擇語句,針對不同的消息產(chǎn)生不同的響應(yīng)。一般MSG_CREATE消息在窗口生成時被發(fā)送棚哪,因而控件往往在這里調(diào)用CreateWindow函數(shù)生成。MSG_PAINT則是在移動窗口或調(diào)用UpdateWindow重繪時發(fā)生,可根據(jù)需要定義相應(yīng)的操作。MSG_CLOSE即是關(guān)閉窗口時的動作,一般調(diào)用DestroyMainWindow銷毀主窗口,調(diào)用PostQuitMessage退出消息循環(huán)。
此外,在窗口過程函數(shù)MiniGUI提供的GDI,即圖形設(shè)備接口(graphics device interface),可以方便地將BMP、GIF、JPEG等圖片用LoadBitmap函數(shù)輸出到界面,并通過設(shè)備上下文(DC)的邏輯字體(logfont)實現(xiàn)多字體和多字符集支持。
廣告進(jìn)程的制作也類似,不再說明。
(2)信息終端軟件服務(wù)器程序
如何用C語言開發(fā)窗體應(yīng)用程序。。
windows 下用 MFC 類庫
linux下 用 QT
都是C++的類庫
生產(chǎn)窗體可以使用CreateWindowEx函數(shù)。
函數(shù)功能:該函數(shù)創(chuàng)建一個具有擴(kuò)展風(fēng)格的層疊式窗口、彈出式窗口或子窗口,其他與CreateWindow函數(shù)相同。
函數(shù)原型:
CreateWindowEx函數(shù)創(chuàng)建一個層疊的,自動彈出的(pop-up)或是一個子窗口通過擴(kuò)展格式。另外這個函數(shù)的作用與CreateWindow函數(shù)的作用相同。要獲得更多的關(guān)于創(chuàng)建窗口的信息和關(guān)于CreateWindowEx函數(shù)參數(shù)的詳細(xì)描述。參見CreateWindow
HWND CreateWindowEx(
DWOR DdwExStyle,//窗口的擴(kuò)展風(fēng)格
LPCTSTR lpClassName, //指向注冊類名的指針
LPCTSTR lpWindowName, //指向窗口名稱的指針
DWORD dwStyle,//窗口風(fēng)格
int x, //窗口的水平位置
int y, //窗口的垂直位置
int nWidth,//窗口的寬度
int nHeight,//窗口的高度
HWND hWndParent,//父窗口或螞的句柄
HMENU hMenu,//菜單的句柄或是子窗口的標(biāo)識符
HINSTANCE hInstance, //應(yīng)用程序?qū)嵗木浔?/p>
LPVOID lpParam//指向窗口的創(chuàng)建數(shù)據(jù)
);
例程:
include
#include
LRESULT CALLBACK WinDouProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
class CWnd
{
public:
CWnd()
帶團(tuán)悶{
m_hWnd = NULL;
}
BOOL CreateEx(
DWORD dwExStyle, // extended window style
LPCTSTR lpClassName, // pointer to registered class name
LPCTSTR lpWindowName, // pointer to window name
DWORD dwStyle,// window style
int x, // horizontal position of window
int y, // vertical position of window
int nWidth,// window width
int nHeight,// window height
HWND hWndParent, // handle to parent or owner window
HMENU hMenu,// handle to menu or child-window identifier
HANDLE hInstance, // handle to application instance
LPVOID lpParam// pointer to window-creation data
);
BOOL ShowWindow( int nCmdShow );
BOOL UpdateWindow();
public:
HWND m_hWnd;
};
BOOL CWnd::CreateEx(
DWORD dwExStyle, // extended window style
LPCTSTR lpClassName, // pointer to registered class name
LPCTSTR lpWindowName, // pointer to window name
DWORD dwStyle,// window style
int x, // horizontal position of window
int y, // vertical position of window
int nWidth,// window width
int nHeight,// window height
HWND hWndParent, // 蠢彎handle to parent or owner window
HMENU hMenu,// handle to menu or child-window identifier
HANDLE hInstance, // handle to application instance
LPVOID lpParam// pointer to window-creation data
)
{
m_hWnd = ::CreateWindowEx (dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,(HINSTANCE)hInstance,lpParam);
if(m_hWnd != NULL)
return TRUE;
else
return FALSE;
}
BOOL CWnd::ShowWindow(int nCmdShow)
{
return ::ShowWindow(m_hWnd,nCmdShow);
}
BOOL CWnd::UpdateWindow()
{
return ::UpdateWindow(m_hWnd);
}
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // pointer to command line
int nCmdShow// show state of window
)
{
WNDCLASS wndclass; //先設(shè)計窗口類
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);
wndclass.hCursor = LoadCursor(NULL,IDC_HELP);
wndclass.hIcon = LoadIcon(NULL,IDI_WARNING);
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = WinDouProc;
wndclass.lpszClassName = “Magic_Maggie”;
wndclass.lpszMenuName = 0;
wndclass.style = CS_VREDRAW | CS_HREDRAW;
//某一個變量原油幾個變量去掉一個特征,可以用取反(~)后再進(jìn)行與(&)
//例如:style上去掉CS_NOCLOSE,可以style&~CS_NOCLOSE;
RegisterClass(&wndclass); ///注意先建立再注冊昂
CWnd wnd;
wnd.CreateEx(NULL,”Magic_Maggie”,”DouDou”,WS_OVERLAPPEDWINDOW,0,0,800,600,NULL,NULL,hInstance,NULL);
wnd.ShowWindow(SW_SHOWNORMAL);
wnd.UpdateWindow();
MSG msg; //消息循環(huán)
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg); //觸發(fā)WinDouProc
}
return 0;
}
LRESULT CALLBACK WinDouProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_LBUTTONDOWN:
MessageBox(hwnd,”您按下了鼠標(biāo)左鍵昂”,”豆豆的程序”,MB_OK);
HDC hdc;
hdc = GetDC(hwnd);
//The GetDC function retrieves a handle to a display device context for the client area of a specified window or for the entire screen. You can use the returned handle in subsequent GDI functions to draw in the device context.
TextOut(hdc,0,0,”感謝您對豆豆程序的支持昂”,strlen(“感謝您對豆豆程序的支持昂”));
ReleaseDC(hwnd,hdc);
break;
case WM_CHAR:
char szChar;
sprintf(szChar,”Char is %d”,wParam);
MessageBox(hwnd,szChar,”豆豆的程序”,MB_OK);
break;
case WM_PAINT:
PAINTSTRUCT ps;
HDC hDc;
hDc = BeginPaint(hwnd,&ps);
TextOut(hDc,0,0,”這個是重繪滴哦”,strlen(“這個是重繪滴哦”));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE: //這個case與下邊的destroy這個case不要弄錯了,否則窗口不出現(xiàn),但任務(wù)管理器中運(yùn)行
if(IDYES == MessageBox(hwnd,”您真的要退出么?”,”豆豆的程序”,MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
//////////////////////////////////////////?????????????????????
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam); // 別忘記了return
}
return 0;
}
C語言是一門通用計算機(jī)編程語言,應(yīng)用廣泛。C語言的設(shè)計目標(biāo)是提供一種能以簡易的方式編譯、處理低級存儲燃念兆器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平臺的特性,以一個標(biāo)準(zhǔn)規(guī)格寫出的C語言程序可在許多電腦平皮租臺上進(jìn)行編譯,甚至包含一些嵌入式處理器(單片機(jī)或稱MCU)以及超級電腦等作業(yè)平臺。
#include
//Function prototype.
int WINAPI WinMain(HINSTANCE,HINSTANCE ,LPSTR ,int);
LRESULT CALLBACK MainWndProc(HWND ,UINT ,WPARAM,LPARAM);
InitApplication(HINSTANCE);
InitInstance(HINSTANCE,int);
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT nMsg,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(nMsg)
{
case WM_COMMAND:
{
hdc = GetDC((HWND)lParam);
GetClientRect ((HWND)lParam, &rect) ;
DrawText(hdc,”HOHO”,-1,&rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
ReleaseDC((HWND)lParam,hdc);
}
break;
case WM_PAINT:
{
hdc = BeginPaint(hwnd,&ps);
GetClientRect (hwnd, &rect) ;
DrawText(hdc,”Hello Word”,-1,&rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd,&ps);
}
break;
//按鍵
case WM_KEYDOWN:
if(wParam == VK_ESCAPE)
SendMessage(hwnd,WM_CLOSE,0,0);
break;
case WM_CHAR:
switch(wParam)
{
case ‘w’:
MessageBox(hwnd,”UP”,”KeyBorad Input”,MB_OK);
break;
case ‘s’:
MessageBox(hwnd,”DOWN”,”KeyBorad Input”,MB_OK);
break;
case ‘a(chǎn)’:
MessageBox(hwnd,”LEFT”,”KeyBorad Input”,MB_OK);
break;
case ‘d’:
MessageBox(hwnd,”RIGHT”,”KeyBorad Input”,MB_OK);
break;
}
break;
/高做/關(guān)閉
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,nMsg,wParam,lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInStance,
LPSTR lpCmdLine,int nCmdShow)
{
MSG msg;
if(!InitApplication(hInstance))
{
MessageBox(NULL,”InitApplication Failed”,”Error!”,MB_ICONEXCLAMATION | MB_OK);
return FALSE;
}
if(!InitInstance(hInstance,nCmdShow)){
MessageBox(NULL,”InitInstance Failed”,”Error!”,MB_ICONEXCLAMATION | MB_OK);
return FALSE;
}
while(GetMessage(&msg,(HWND) NULL,0,0)>0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
InitApplication(HINSTANCE hInstance)
{
WNDCLASS wc;
wc.style = CS_DBLCLKS;
wc.lpfnWndProc = MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = “MainWClass”;
return RegisterClass(&wc);
}
InitInstance(HINSTANCE hInstance,int nCmdShow){
HWND hwnd;
HWND hwndCloseButton;
hwnd = CreateWindow(
“MainWClass”,
“Sample”,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
(HWND)NULL,
(HMENU)NULL,
hInstance,
(LPVOID)NULL);
if(!hwnd)
return FALSE;
hwndCloseButton = CreateWindow(
“BUTTON”,
“CLOSE”,
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
100,
100,
100,
80,
hwnd,
(HMENU)NULL,
hInstance,
(LPVOID)NULL);
if(!hwndCloseButton)
return FALSE;
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
return TRUE;
}
學(xué)了Windows API就可以了
調(diào)用別人的函數(shù)接口,立馬做窗口程序。
可以看看 Windows 程序設(shè)計這本書(C語言),樓下那個根畝頌昌本就不知道接口是什么,C語言有微軟提供的C語言圖形函數(shù)櫻巧庫,迅扒調(diào)用之后就可以開發(fā)窗口程序
關(guān)于createwindow linux的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
本文標(biāo)題:如何在Linux上創(chuàng)建窗口?(createwindowlinux)
標(biāo)題鏈接:http://www.dlmjj.cn/article/cdgdgcj.html


咨詢
建站咨詢
