`
tcspecial
  • 浏览: 911655 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

QT 下新建windows窗体

阅读更多

   这几天做windows上进程通信发现,windows消息只能在窗口之间传递,不能在控制台之间传递,因为控制台程序没有消息循环,无法接收消息. 普通控制台程序不能提供消息循环,但是QT是提供(app.exec())消息循环的,也就是说是可以接收windows消息的. 

  先看一下windows新建窗口代码,经典的windows图形程序: 

#include <windows.h> 
#include <stdio.h>

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int); 
BOOL InitApplication(HINSTANCE); 
BOOL InitInstance(HINSTANCE, int); 
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM); 
 
HINSTANCE hinst; // 窗口句柄

// windows GUI入口
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 
    if (!InitApplication(hinstance)) 
        return FALSE; 
 
    if (!InitInstance(hinstance, nCmdShow)) 
        return FALSE; 
 
	// 循环派发消息
	MSG msg; 
    while (GetMessage(&msg, (HWND) NULL, 0, 0)) 
    { 
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
    return msg.wParam; 
} 
 
// 注册窗口
BOOL InitApplication(HINSTANCE hinstance) 
{ 
    WNDCLASSEX wcx; 
    wcx.cbSize = sizeof(wcx);         
    wcx.style = CS_HREDRAW|CS_VREDRAW;               
    wcx.lpfnWndProc = MainWndProc;    
    wcx.cbClsExtra = 0;               
    wcx.cbWndExtra = 0;              
    wcx.hInstance = hinstance;        
    wcx.hIcon = LoadIcon(NULL,IDI_APPLICATION);           
    wcx.hCursor = LoadCursor(NULL,IDC_ARROW);                  
    wcx.hbrBackground = (HBRUSH)(COLOR_BACKGROUND);              
    wcx.lpszMenuName =  NULL;    
    wcx.lpszClassName = "MainWClass"; 
    wcx.hIconSm = NULL;
 
    return RegisterClassEx(&wcx); 
} 
 
// 新建窗口
BOOL InitInstance(HINSTANCE hinstance, int nCmdShow) 
{ 
    HWND hwnd; 
 
    hinst = hinstance;  
 
    hwnd = CreateWindow( 
        "MainWClass",        // name of window class 
        "Sample",            // title-bar string 
        WS_OVERLAPPEDWINDOW, // top-level window 
        CW_USEDEFAULT,       // default horizontal position 
        CW_USEDEFAULT,       // default vertical position 
        200,       // default width 
        200,       // default height 
        (HWND) NULL,         // no owner window 
        (HMENU) NULL,        // use class menu 
        hinstance,           // handle to application instance 
        (LPVOID) NULL);      // no window-creation data 
 
    if (!hwnd) 
        return FALSE; 
 
    ShowWindow(hwnd, nCmdShow); 
    UpdateWindow(hwnd); 

    return TRUE;
} 

// 消息处理中心
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	switch (message) 
	{
	case WM_CREATE:
	case WM_SHOWWINDOW:
	case WM_KEYDOWN:
	case WM_COMMAND:
		return ::DefWindowProc(hWnd, message, wParam, lParam);
	case WM_LBUTTONDOWN: // 按下鼠标左键
		{
			MessageBox(GetFocus(), "Hello", "Hello", MB_OK|MB_ICONASTERISK);
			break;
		}
	case WM_NOTIFYFORMAT: // 用户登录通知事件
		{
			MessageBox(GetFocus(), "Notify", "Hello", MB_OK|MB_ICONASTERISK);
			break;
		}
	case WM_SETTEXT:
		{
			MessageBox(GetFocus(), "SET TEXT", "Hello", MB_OK|MB_ICONASTERISK);
			break;
		}
	case WM_COPYDATA: // 传递数据
		{
			COPYDATASTRUCT *cp=(COPYDATASTRUCT*)lParam;
			MessageBox(GetFocus(), (char*)cp->lpData, "data", MB_OK|MB_ICONASTERISK);
			return ::DefWindowProc(hWnd, message, wParam, lParam);
		}
	case WM_USER+10: // 自定义事件
		{
			MessageBox(GetFocus(), "User info Msg", "Hello", MB_OK|MB_ICONASTERISK);
			break;
		}
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return ::DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

 

   可以看出,windows UI需要WinMain提供当前程序句柄, 需要一循环去派发消息. QT也提供事件循环,通过GetModuleHandle(NULL)即可获取当前实例句柄,这样就可以在QT调用windows api 新建窗口

 

int main(int argc,char **argv)
{
	QApplication app(argc,argv);

        // 返回当前实例句柄 
	HINSTANCE hinstance = (HINSTANCE)GetModuleHandle(NULL);

	if (!InitApplication(hinstance)) 
		return FALSE; 

	if (!InitInstance(hinstance, SW_SHOW)) 
		return FALSE; 

	return app.exec();
}

 

  运行结果:

  window

  • 大小: 12.2 KB
分享到:
评论

相关推荐

    qt window 窗体的实现,包括保存,新建,打开文件,

    它由The Qt Company维护,并广泛应用于Linux、Windows、MacOS以及其他操作系统。本项目主要关注Qt中的窗口管理,尤其是涉及到文件操作的部分,如保存、新建、打开、删除、剪切和复制。 在Qt中,窗口通常通过`...

    一个简单的Qt登录窗体进到主窗体的例子

    Qt是一个跨平台的C++库,广泛用于图形用户界面(GUI)应用开发,支持Windows、Linux、macOS等多个操作系统。它提供了丰富的API,使得开发者能够高效地构建功能丰富的应用程序。 首先,让我们理解Qt的基本编程模型。...

    MFC程序调用Qt(DLL)界面显示

    在Qt Creator中,选择"新建项目",然后选择"库" -&gt; "Qt库" -&gt; "Qt DLL"。填写必要的项目信息,如项目名、位置等,并确保选择正确的编译器和Qt版本。在项目设置中,选择需要包含的Qt模块,通常至少包括"Widgets"模块...

    Qt之无边框界面包括最大化、最小化和关闭按钮及实现可移动、窗口伸缩功能

    在Qt编程中,有时我们需要创建一个无边框的窗口,以实现更加自定义的界面设计。无边框窗口可以提供更灵活的布局和外观,但同时也需要我们手动添加常见的窗口操作,如最大化、最小化、关闭按钮以及窗口的移动和大小...

    使用QT进行程序开发入门快速指导 V2.0

    本指南旨在帮助初学者快速掌握QT开发的基本流程,特别关注如何在Visual Studio 2010环境下进行QT项目的构建。 1. **概述** QT框架提供了丰富的库和工具,使得开发者可以轻松创建图形用户界面(GUI)应用程序。QT...

    《Qt Creator快速入门》

    在Qt Creator中,你可以通过“文件”&gt;“新建文件或项目”来创建新项目。选择合适的模板,如Qt Widgets Application,输入项目名称和位置,然后点击“下一步”完成设置。 4. **代码编辑器** Qt Creator的内置代码...

    C++/ qt 编写一个简单计算器

    Qt是一个功能强大的跨平台应用开发框架,支持多种操作系统,包括Windows、Linux、macOS等。C++作为面向对象的编程语言,结合Qt库,可以创建用户界面丰富、功能完善的桌面应用。 首先,我们需要理解Qt中的主要组件,...

    在桌面中嵌入窗体.rar

    在Windows操作系统中,窗体是基于窗口消息机制构建的,而在跨平台的环境中,如Qt或JavaFX,窗体则通过各自的API来实现。 在桌面应用中嵌入窗体,通常涉及以下步骤: 1. **选择开发工具和框架**:根据你的需求和...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    2.新建对话框类,如下图,在新建中,选择Qt Designer Form Class。 3.选择Dialog without Buttons。 4.类名设为myDlg。 5.点击Finish 完成。注意这里已经默认将其加入到了我们刚建的工程中了。 6.如下图,在mydlg.ui...

    多文档窗体

    实现窗体皮肤可能涉及使用第三方库,如Windows API的DrawThemeBackground函数,或者更高级的UI框架,如Qt或WPF。皮肤通常包括窗口边框、标题栏、菜单样式等元素的设计。 5. **消息循环和窗口过程**: 在Windows...

    完结24章Qt 全流程实战企业级项目 - 云对象存储浏览器

    Qt支持所有的UNIX系统,当然也包括Linux系统,还支持WinNT/Win2k、Windows 95/98平台。 二、QT的优点有哪些? 1、作为桌面前端的SDK,成熟度很高; 2、由商业公司控制,技术路线很稳定; 3、API没有大量采用晦涩...

    Qt开发教程.docx

    - 使用Qt Designer拖放控件到窗体上。 - 设置控件属性,如颜色、字体等。 - 连接信号和槽机制。 4. **编写代码**: - 在Qt Creator中使用C++编写业务逻辑。 - 使用Qt API访问控件、窗口、文件系统等。 5. **...

    visual studio2005配置qt环境.doc

    首先,我们要理解Qt是一个跨平台的框架,适用于包括Windows、Unix/X11和Macintosh在内的多种操作系统。 **步骤一:安装Visual Studio 2005** 确保安装的是非Express版本的Visual Studio 2005,并且至少包含了C++...

    如何创建移动的窗体

    默认情况下,窗体已经具有可移动的能力,但我们可以手动设置以确保这一点。 3. **设置窗体属性**: 在属性窗口中,找到`FormBorderStyle`属性,将其设置为`Sizable`或`None`。这将允许用户通过点击并拖动窗体标题...

    arm开发板QT应用实验

    1. **新建工程项目**:首先需要创建一个新的Qt工程文件(`.pro`),这可以通过Qt Creator的File &gt; New File or Project菜单来完成。 - 选择“C++ Project”,并指定工程名称和位置。 - 保存为`.pro`文件。 2. **...

    QT初学者参考

    - **环境准备**:在Windows环境下安装QT和MinGW,具体步骤可以参考博客文章《Eclipse+MinGW+Qt开发环境设置》。安装完成后,可以通过开始菜单找到“QTDesigner”。 - **界面介绍**: - **工具箱**:位于左侧,包含...

    非常漂亮的窗体,支持菜单、工具栏、状态栏_非常漂亮的窗体_支持菜单、工具栏、状态栏_

    在编程实现时,开发者会使用各种UI框架或库,如Windows Forms、WPF、Qt、JavaFX等,来创建和定制这样的窗体。 5. **文件名“Clock”**:在提供的文件名列表中,“Clock”可能表示这是一个与时间显示或计时相关的...

Global site tag (gtag.js) - Google Analytics