Linux是一种自由、开放源代码的操作系统,使用非常广泛。尽管Linux操作系统本身并不支持窗口图形界面,但是我们可以使用一些工具和框架来在Linux中创建窗口,这方面最主要的工具就是X Window。
一、什么是X Window
X Window是一种用于显示图形界面的系统,它是基于客户端/服务器架构的。在Linux操作系统中,X Window通常称为X11。X Window系统包括三个主要组件:服务器、客户端和窗口管理器。X Window服务器运行在Linux操作系统上,接收来自客户端的请求并显示反馈。客户端是应用程序,它们通过向服务器发送请求来显示窗口。
窗口管理器是一种特殊的客户端,它有两个主要功能:管理窗口和控制窗口的外观和感觉。常用的窗口管理器有GNOME、KDE、Xfce等。
二、如何在Linux上安装X Window
如果你使用的是Ubuntu,可以使用以下命令来安装X Window:
“`sudo apt-get install x-window-system“`
如果你使用的是其他Linux发行版,可以使用以下命令来查看是否已经安装了X Window:
“`which startx“`
如果输出结果为/usr/bin/startx,则说明X Window已经安装。否则,你需要使用适当的命令来安装它。
三、如何在Linux上创建窗口
在Linux中创建窗口的过程与在其他操作系统中创建窗口类似。您需要使用合适的编程语言和框架来创建窗口。在Linux中,常用的框架有GTK+、Qt、Tk等。
1、使用GTK+创建窗口
GTK+是一个流行的开源工具包,用于创建图形用户界面。它是GNOME桌面环境的默认工具包,因此在Linux中很常见。要在Linux中创建GTK+窗口,请遵循以下步骤:
– 安装GTK+
在Ubuntu中,可以使用以下命令安装GTK+:
“`sudo apt-get install libgtk-3-dev“`
如果你使用的是其他Linux发行版,请使用适当的命令来安装它。
– 编写GTK+窗口程序
以下代码演示了如何使用GTK+创建一个简单的窗口:
“`#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函数创建一个名为window的新窗口。然后,使用gtk_window_set_title函数设置窗口标题。使用gtk_widget_show函数来显示窗口,gtk_mn函数用于等待事件的发生。
– 编译GTK+程序
使用以下命令将程序编译为可执行文件:
“`gcc -o window window.c `pkg-config –cflags –libs gtk+-3.0“`
要运行新创建的窗口,请使用以下命令:
“`./window“`
2、使用Qt创建窗口
Qt是一个跨平台的框架,用于创建图形用户界面。它可以在Linux、Windows和macOS等操作系统中使用。要在Linux上使用Qt创建窗口,请遵循以下步骤:
– 安装Qt
在Ubuntu中,可以使用以下命令安装Qt:
“`sudo apt-get install qt5-default“`
如果你使用的是其他Linux发行版,请使用适当的命令来安装Qt。
– 编写Qt窗口程序
以下代码演示了如何使用Qt创建一个简单的窗口,其中使用了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类创建一个名为window的新窗口。然后,使用resize函数设置窗口的大小,使用setWindowTitle函数设置窗口标题。使用show函数来显示窗口,app.exec()函数用于等待事件的发生。
– 编译Qt程序
使用以下命令将程序编译为可执行文件:
“`qmake -project
qmake
make“`
要运行新创建的窗口,请使用以下命令:
“`./window“`
四、
在Linux中创建窗口需要使用适当的工具和框架,如X Window、GTK+、Qt等。每种工具和框架都有不同的优缺点,可根据您的特定需求和偏好选择。
相关问题拓展阅读:
- 嵌入式软件和信息终端软件是什么?
- 如何用C语言开发窗体应用程序。。
嵌入式软件和信息终端软件是什么?
1 嵌入式linux系统
嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁减。适用于用户系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。从20世纪80年代末开始,陆续出现了一些嵌入式操作系统,如VxWorks、pSOS、WindowsCE、Linux等。其中免费源代码的Linux操作系统因其内核小、支持多种硬件平台、可裁减性好等显著优点,得到了广泛的关注,为嵌入式系统开发提供了一个极有力的选择。
信息终端软件开发
本系统中采用了MiniGUI专为嵌入式系统开发的Lite版本。它基于客户/服务器(C/S)体系,在服务器和客户之间传递输入设备数据,以及客户和服务器之间的某些语法 和响应数据。
在该信息终端软件中,就根据这种结构特点,设计了一个服务器程序和两个客户进程。服务器始终运行后台,记录有关系统信息,如系统计时、用户刷卡余额等,通过MiniGUI提供的Socket机制通信将数据传给下面的客户程序。主界面客户进程给用户提供了完整的操作体验,用户可以通过菜单选择打、浏览信息等功能。另一客户进程则是广告屏保,在无人使用的间隙时间里,可以动态显示一些精彩的画面,实现商业价值或公益宣传。下面分别进行介绍。
(1)信息终端客户程序
该信息终端主体界面客户程序在MiniGUI服务器的控制台程序下打开,弹出的是信息终端的主菜单,显示了、信息查询、城市交通、新闻专栏等板块。
程序实现时,开始是包含的头文件。
MiniGUI图形包的头文件茄和宽有:common.h(MiniGUI常用的宏及数据类型的定义)、minigui.h(全局的和通用的接口函数及杂项函数的定义)、window.h(定义了和窗口有关的宏、数据类型、数据结构和窗口函数)。使用GDI函数和控件还需包括gdi.h、control.h两个头文件。
编程实现时,MiniGUI的程序入口点是MiniGUIMain函数,系统初始化后就会自动找到该函数。在该函数中先设置主窗口一些基本属性,建立每个客户程序唯一的一个消息队列。当程序结束时,调用MainWindow ThreadCleanup函数,清除主窗口所使用的消息队列系统资源,退回服务器程序中。
其各个功能子函数是在MiniGUI程序的另一主体部分——主界面窗口的过程函数中调用打开的。在主窗口建立时,其中有一项属性MainWindowProc,即是注明了对应该窗口的过程函数。各个功能颤亮模块的消息也都是通过主窗口中的消息循环进行触发的。
窗口过程函数主体上都是switch和case结构的选择语句,针对不同的消息产生不同的响应。一般MSG_CREATE消息在窗口生成时被发送棚哪,因而控件往往在这里调用CreateWindow函数生成。MSG_PAINT则是在移动窗口或调用UpdateWindow重绘时发生,可根据需要定义相应的操作。MSG_CLOSE即是关闭窗口时的动作,一般调用DestroyMainWindow销毁主窗口,调用PostQuitMessage退出消息循环。
此外,在窗口过程函数MiniGUI提供的GDI,即图形设备接口(graphics device interface),可以方便地将BMP、GIF、JPEG等图片用LoadBitmap函数输出到界面,并通过设备上下文(DC)的逻辑字体(logfont)实现多字体和多字符集支持。
广告进程的制作也类似,不再说明。
(2)信息终端软件服务器程序
如何用C语言开发窗体应用程序。。
windows 下用 MFC 类库
linux下 用 QT
都是C++的类库
生产窗体可以使用CreateWindowEx函数。
函数功能:该函数创建一个具有扩展风格的层叠式窗口、弹出式窗口或子窗口,其他与CreateWindow函数相同。
函数原型:
CreateWindowEx函数创建一个层叠的,自动弹出的(pop-up)或是一个子窗口通过扩展格式。另外这个函数的作用与CreateWindow函数的作用相同。要获得更多的关于创建窗口的信息和关于CreateWindowEx函数参数的详细描述。参见CreateWindow
HWND CreateWindowEx(
DWOR DdwExStyle,//窗口的扩展风格
LPCTSTR lpClassName, //指向注册类名的指针
LPCTSTR lpWindowName, //指向窗口名称的指针
DWORD dwStyle,//窗口风格
int x, //窗口的水平位置
int y, //窗口的垂直位置
int nWidth,//窗口的宽度
int nHeight,//窗口的高度
HWND hWndParent,//父窗口或蚂的句柄
HMENU hMenu,//菜单的句柄或是子窗口的标识符
HINSTANCE hInstance, //应用程序实例的句柄
LPVOID lpParam//指向窗口的创建数据
);
例程:
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()
带团闷{
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; //先设计窗口类
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;
//某一个变量原油几个变量去掉一个特征,可以用取反(~)后再进行与(&)
//例如: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; //消息循环
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg); //触发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,”您按下了鼠标左键昂”,”豆豆的程序”,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不要弄错了,否则窗口不出现,但任务管理器中运行
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语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储燃念兆器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平皮租台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
#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’:
MessageBox(hwnd,”LEFT”,”KeyBorad Input”,MB_OK);
break;
case ‘d’:
MessageBox(hwnd,”RIGHT”,”KeyBorad Input”,MB_OK);
break;
}
break;
/高做/关闭
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;
}
学了Windows API就可以了
调用别人的函数接口,立马做窗口程序。
可以看看 Windows 程序设计这本书(C语言),楼下那个根亩颂昌本就不知道接口是什么,C语言有微软提供的C语言图形函数樱巧库,迅扒调用之后就可以开发窗口程序
关于createwindow linux的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。