首页 > 编程知识 正文

java语言gui程序设计,javaapi

时间:2023-05-04 15:47:21 阅读:20257 作者:1505

图形用户界面(GUI )或图形用户界面是以图形方式显示计算机操作的用户界面。 与以前计算机上使用的命令行相比,图形界面更容易被用户接受。

1 .命令行APP应用命令行APP应用程序是基于Linux操作系统上的ls、gcc、ifconfig命令等顺序执行结构的可执行程序。 这样的可执行程序在运行中不需要与用户交互,程序运行到最后后,用户会生成可执行程序或发出错误消息等结果。 程序的执行有固定的开始和固定的结束。

2 .图形界面APP应用随着计算机技术的发展,计算机越来越平民化,计算机用户不再是专业的计算机工作者。 为不是计算机专家的用户操作计算机将生成图形界面APP应用程序。 GUI程序是基于消息驱动模型的可执行程序,程序的执行依赖于与用户的交互,并实时响应用户的操作。 GUI程序运行后,不会自行退出。

所有GUI APP应用程序都是基于窗口的,程序进程的伪代码如下:

voidmian(intargc,char** argv )/1 .主窗口(/2 )主窗口)/3 (主窗口中的元素)/4 (主窗口)/5的显示无论是跨平台Qt GUI APP应用程序还是其他基于Windows的MFC等GUI APP应用程序,原理都是一样的。

GUI程序执行后,不会自行结束,而是接收消息并停留在根据消息执行适当操作的循环中。 消息处理模型如下:

以触摸屏为例,当用户点击触摸屏时,首先感知到屏幕上的触摸XY坐标是操作系统内核空间的触摸屏设备驱动程序,设备驱动程序将用户操作发送到GUI程序运行时创建的消息GUI程序必须在运行时实时处理队列中的消息,如果队列中没有消息,则程序将处于停滞状态。

3. Windows平台上的GUI程序示例在windows上实现GUI有很多方法。 每种方法都有自己的开发理念和工具,常见的有:

a.windows API :直接调用windows的基本绘制函数。 与基础相关的基本都是用c语言写的,这些API也是同样的。

b.MFC :使用windows API封装到控件类中

c.windows form :基于. net的GUI开发,完全组件化,但需要. net运行时库支持

.

其中基于Windows API开发的GUI程序是函数调用Windows消息处理的方法,这是所有GUI程序的原理。

Windows API编写GUI的最基本函数如下:

a .在系统中注册GUI窗口Registerclass(GUI窗口样式定义) ) ) ) ) ) ) ) ) ) )。

原型:

# defineregisterclassregisterclasswatomwinapiregisterclassw (_ inconstwndclassw * LP wndclass ); b .创建窗口或窗口元素CreateWindow ()

# definecreatewindowcreatewindoww # definecreatewindoww (LP类名称,LP窗口名称,dwStyle,x,y,nWidth,nheight lpp lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,

createwindow w (_ in _ optlpcwstrlpclassname,/创建窗口__in_opt LPCWSTR lpWindowName,/窗口标题__in DWORD dwStyle //窗口左上角的y坐标__in int nWidth,//窗口宽度__in int nHeight,//窗口高度__in_opt HWND hWndParent, //窗口//窗口菜单栏/子窗口的标识符__in_opt HINSTANCE hInstance, //APP应用程序实例的句柄__in_opt LPVOID lpParam //窗口的创建数据) createwindow是CreateWindowExW (调用函数并创建CreateWindowExW

HWND WINAPI

CreateWindowExW( __in DWORD dwExStyle, __in_opt LPCWSTR lpClassName, __in_opt LPCWSTR lpWindowName, __in DWORD dwStyle, __in int X, __in int Y, __in int nWidth, __in int nHeight, __in_opt HWND hWndParent, __in_opt HMENU hMenu, __in_opt HINSTANCE hInstance, __in_opt LPVOID lpParam);

  c. 显示创建好的窗口ShowWindow()

BOOL WINAPI ShowWindow(__in HWND hWnd, __in int nCmdShow);

  hWnd指窗口句柄,nCmdShow指定窗口如何显示

  d. 刷新屏幕上的窗口UpdateWindow()

WINUSERAPI BOOL WINAPI UpdateWindow(__in HWND hWnd);

  e. 获取程序中消息队列中的消息GetMessage()

#define GetMessage GetMessageWBOOL WINAPI GetMessageW(__out LPMSG lpMsg, __in_opt HWND hWnd, __in UINT wMsgFilterMin, __in UINT wMsgFilterMax);

  f. 翻译系统消息TranslateMessage()

WINUSERAPI BOOL WINAPI TranslateMessage(__in CONST MSG *lpMsg);

  内核空间发到用户空间的消息需要调用此函数翻译后才能传给GUI程序对应的消息处理函数

  g. 将消息发给窗口处理函数DispatchMessage()

#define DispatchMessage DispatchMessageWWINUSERAPI LRESULT WINAPI DispatchMessageW(__in CONST MSG *lpMsg);

  新建visual studio 2010的Win32工程:

#define STYLE_NAME L"WIN"#define BUTTON_ID 7777//窗口消息处理函数LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ /* 调用系统提供的默认消息处理函数 */ return DefWindowProc(hWnd, message, wParam, lParam);}/* 相当于c/c++的main函数 */BOOL WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ MSG msg = {}; //定义一个消息队列 HWND main_hwnd = NULL; //窗口句柄 HWND hwnd = NULL; //窗口内的元素句柄 WNDCLASS WndClass = {0};//定义描述窗口样式 //为窗口样式赋值 WndClass.style = 0; WndClass.cbClsExtra = 0; WndClass.cbClsExtra = 0; WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW); // 定义窗口背景色 WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); // 定义鼠标样式 WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 定义窗口左上角图标 WndClass.hInstance = hInstance; // 定义窗口式样属于当前应用程序 WndClass.lpfnWndProc = WndProc; // 窗口消息处理函数 WndClass.lpszClassName = STYLE_NAME; // 窗口样式名 WndClass.lpszMenuName = NULL; //1. 将定义好的窗口式样注册到系统 RegisterClass(&WndClass); //2. 创建窗口,返回窗口的句柄 main_hwnd = CreateWindow(STYLE_NAME, // 通过定义好的窗口式样创建主窗口 STYLE_NAME, // 主窗口标题 WS_OVERLAPPEDWINDOW, // 创建后主窗口的显示风格 CW_USEDEFAULT, // 主窗口左上角 x 坐标 CW_USEDEFAULT, // 主窗口左上角 y 坐标 CW_USEDEFAULT, // 主窗口宽度 CW_USEDEFAULT, // 主窗口高度 NULL, // 父窗口 NULL, // 窗口菜单栏 hInstance, // 主窗口属于当前应用程序 NULL); // 窗口参数 //获取该窗口的信息 hInstance = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE); //3. 创建窗口内元素,即按钮 hwnd = CreateWindow(L"button", // 通过系统预定义式样创建窗口元素 L"My Button", // 窗口元素标题 WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, // 窗口元素的显示风格 50, // 窗口元素在窗口中的左上角 x 坐标 50, // 窗口元素在窗口中的左上角 y 坐标 200, // 窗口元素的宽度 60, // 窗口元素的高度 main_hwnd, // 窗口元素所在的父窗口 (HMENU)BUTTON_ID, // 窗口元素 ID 值 hInstance, // 窗口元素属于当前应用程序 NULL); // 窗口元素参数 ShowWindow(main_hwnd,nCmdShow); // 显示窗口 UpdateWindow(main_hwnd); // 刷新窗口 //4. 循环接收系统消息 while (GetMessage(&msg, NULL, NULL, NULL) ) { //翻译消息 TranslateMessage(&msg); //将消息发给对应GUI的消息处理函数 DispatchMessage(&msg); } return TRUE;}

  编译运行:

  程序运行窗口如图。对该窗口可以利用鼠标操作进行最大/小化,拖动等。用户利用鼠标操作该窗口时,操作系统的内核会收到用户的输入信息并转换为消息发给当前的GUI程序,GUI程序的WndProc()函数收到消息后,执行相应处理。在WndProc()中,调用DefWindowProc()执行默认处理,这就是为什么程序对鼠标的最大/小化操作、拖动等能响应,而在代码中我们并没有位这些操作设置响应函数的原因。

  但是注意,点击关闭按钮后,窗口虽然被关闭了但是GUI程序并没有退出,显然这是因为DefWindowProc()对窗口关闭按钮并没有默认操作。在实际软件中有点击窗口关闭按钮并不一定是退出GUI程序,如windows的金山词霸,点击关闭按钮只是将其放到后台执行。另外,当鼠标点击“my button”按钮时并无反应,这也是因为消息处理函数并没有对应按钮消息的执行操作,修改如下:

HWND main_hwnd = NULL; //窗口句柄//窗口消息处理函数LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ //处理窗口关闭按钮 if (message == WM_DESTROY) PostQuitMessage(0); //处理窗口内按钮点击操作 if (message == WM_COMMAND) //按钮按下操作属于WM_COMMAND { if (HIWORD(WM_COMMAND) == BN_CLICKED) //HIWORD(WM_COMMAND)表示从WM_COMMAND中拿到按钮是点击 //拖动还是长按,BN_CLICKED表示点击 { //弹出对话框 MessageBox(main_hwnd, L"Hello Button!", L"Message", 0); } } /* 其他操作调用系统提供的默认消息处理函数 */ return DefWindowProc(hWnd, message, wParam, lParam);}

  这样就能使得GUI程序能处理关闭按钮消息和按钮点击消息了。

  综上,GUI程序的开发,分为两部分:
  (1) 在代码中用程序创建窗口及窗口内元素
  (2) 在消息处理函数中根据内核空间发来的消息做出对应的响应

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。