C++/SDK界面开发总结

对于不习惯用MFC的程序员来说,写界面应该是一个头疼的事情了。调用duilib等开源界面库的不讨论,本文主要说说Windows的原生界面功能开发,作为一篇总结,帮助新手入门。

1、窗口

主要通过新建资源窗口实现布局,调用就通过 DialogBox 和 CreateDialog 实现界面的显示。其中 DialogBox 为模态窗口, CreateDialog 为非模态窗口,简要说说区别:

模态窗口:在没有父窗口的时候,调用 DialogBox 实现显示窗口。系统在 DialogBox 这儿卡住,直到窗口关闭后继续以下的代码。

非模态窗口:调用 CreateDialog 之后,代码继续往下执行。如果没有父窗口,则执行 GetMessage TranslateMessage DispatchMessage 这几个代码,如果存在父窗口,则只需要进入父窗口的消息循环,子窗口也可以进行消息循环响应。

2、控件

Windows 下面的控件种类繁多,在此我简要介绍几种的使用

2.1、托盘图标

//
// 文件:notifyicon.h
// 类:hNotifyIcon
// 主要功能:实现系统托盘图标设置
//

#pragma once

#include <Shellapi.h>

class hNotifyIcon {
	NOTIFYICONDATA h_nid;

public:
	hNotifyIcon (HWND hWnd, HICON hIcon, LPCTSTR lpTitle, LPCTSTR lpTips = NULL, int iTimeOut = 5);
	~hNotifyIcon ();

	BOOL Show ();
	BOOL Hide ();
	BOOL Message (LPCTSTR lpMsg, UINT niif_InfoWarningError);
	BOOL IsShow ();
};
//
// 文件:notifyicon.cpp
// 类:hNotifyIcon
// 主要功能:实现系统托盘图标设置
//

#include "notifyicon.h"
#pragma comment(lib, "Shell32.lib")

hNotifyIcon::hNotifyIcon (HWND hWnd, HICON hIcon, LPCTSTR lpTitle, LPCTSTR lpTips, int iTimeOut) {
	this->h_nid.cbSize = sizeof(NOTIFYICONDATA);
	this->h_nid.hWnd = hWnd;
	this->h_nid.uID = GetTickCount ()&0xFFFF;
	this->h_nid.dwState = this->h_nid.dwStateMask = 0;
	this->h_nid.uCallbackMessage = WM_USER+1;
	this->h_nid.hBalloonIcon = this->h_nid.hIcon = hIcon;
	if (lpTips)
		lstrcpy ((LPTSTR)this->h_nid.szTip, lpTips);
	else
		lstrcpy ((LPTSTR)this->h_nid.szTip, lpTitle);
	lstrcpy ((LPTSTR)this->h_nid.szInfoTitle, lpTitle);
	this->h_nid.uTimeout = iTimeOut;
}

hNotifyIcon::~hNotifyIcon () {
	if (this->IsShow ())
		this->Hide ();
}

BOOL hNotifyIcon::Show () {
	this->h_nid.uFlags = NIF_ICON|NIF_INFO|NIF_MESSAGE;
	BOOL bRet = (BOOL) Shell_NotifyIcon (NIM_ADD, &this->h_nid);
	this->h_nid.uFlags = NIF_INFO;
	this->h_nid.dwInfoFlags = NIIF_INFO;
	return bRet;
}

BOOL hNotifyIcon::Hide () {
	this->h_nid.uFlags = NULL;
	return (BOOL) Shell_NotifyIcon (NIM_DELETE, &this->h_nid);
}

BOOL hNotifyIcon::Message (LPCTSTR lpMsg, UINT niif_InfoWarningError) {
	this->h_nid.dwInfoFlags = niif_InfoWarningError;
	lstrcpy (this->h_nid.szInfo, lpMsg);
	return (BOOL) Shell_NotifyIcon (NIM_MODIFY, &this->h_nid);
}

BOOL hNotifyIcon::IsShow () {
	return (BOOL)this->h_nid.uFlags;
}

实现上很简单,和MFC类似,对显示、隐藏、发送泡泡通知等功能进行了封装,需要使用时直接new一个对象出来,简单调用几下就完了。

2.2、ListView / ListCtrl

//风格
DWORD dwStyle = ListView_GetExtendedListViewStyle(hList);
dwStyle |= LVS_EX_FULLROWSELECT;//选中整行
dwStyle |= LVS_EX_CHECKBOXES;//复选框
ListView_SetExtendedListViewStyle(hList, dwStyle);

//添加标头
LV_COLUMN lc;
lc.mask = LVCF_TEXT | LVCF_WIDTH;
lc.cchTextMax = MAX_PATH;
lc.cx = 100;
lc.pszText = TEXT("列1");
ListView_InsertColumn(hList, 0, &lc);
lc.cx = 100;
lc.pszText = TEXT("列2");
ListView_InsertColumn(hList, 1, &lc);
……

//添加行
LVITEM li;
li.mask = LVIF_TEXT;
li.cchTextMax = MAX_PATH;
li.iSubItem = 0;
li.iItem = 0;//插入第几行,从0开始
li.pszText = TEXT("列1");
ListView_InsertItem(hList, &li);
ListView_SetItemText(hList, li.iItem, 1, TEXT("列2"));
……
li.iItem = 1;
li.pszText = TEXT("列1");
ListView_InsertItem(hList, &li);
ListView_SetItemText(hList, li.iItem, 1, TEXT("列2"));
……
……

ListView / ListCtrl 的使用就方便多了,一大批 ListView_ 开头的函数,任君选择。

2.3、TabCtrl,也就是所谓的分页控件

分两步,第一步是初始化

#include <CommCtrl.h>

hwndTab = GetDlgItem();
hwndChild[0] = CreateDialog();
hwndChild[1] = CreateDialog();

TCITEM ti = { 0 };
ti.mask = TCIF_TEXT;
ti.cchTextMax = MAX_PATH;

ti.pszText = TEXT("tab1");
TabCtrl_InsertItem(hwndTab, 0, &ti);
ti.pszText = TEXT("tab2");
TabCtrl_InsertItem(hwndTab, 1, &ti);

第二步,处理WM_NOTIFY消息

case WM_NOTIFY:
	if (((LOWORD(wParam)) == IDC_TAB_MAIN) && (((LPNMHDR)lParam)->code == TCN_SELCHANGE))
	{
		for(int i=0; i<n; i++)
			ShowWindow(hwndChild[i], SW_HIDE);

		ShowWindow(hwndChild[TabCtrl_GetCurSel(hwndTab)], SW_SHOW);
	}
	break;

简单方便。

2.4、任务栏进度条

这个的实现比较麻烦,我放在云盘,需要的点此下载

有两个压缩包,组件可以直接拿来用,源码可以看看实现方法。另外,XP和Vista就不要试了,系统都没有这个接口的。

2.5、其他Windows常用控件

写一行代码:

#include <windowsx.h>

然后点进去,其他该有的都有了,比如RadioButton、CheckBox等等。并不代表所有的都有,SDK界面开发等待着你的发掘。

3、C++/SDK 调用 Gdiplus

有了标准控件,总不能没有绘图吧?GDI太渣,又麻烦又复杂又不支持png还有锯齿。我在这儿简要说说如何引用Gdiplus。

首先,头文件和库别少,命名空间可以不引用,看个人爱好

#include <Gdiplus.h>
#pragma comment(lib, "gdiplus.lib")
using namespace Gdiplus;

然后,下面代码霸气甩进WinMain开头

ULONG_PTR gdiplusToken;
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

最后,下面代码霸气甩进WinMain返回前

GdiplusShutdown(gdiplusToken);

介绍的差不多了。 Win32 博大精深,如有遗漏之处欢迎指正。

时间: 2024-12-15 01:40:45

C++/SDK界面开发总结的相关文章

Unreal SDK 游戏开发从入门到精通(UnrealScript语法、UI Scene界面、UDK独立开发游戏)

对这个课程有兴趣的朋友可以加我的QQ2059055336和我联系 课程内容简介 本系列讲座主要讲述如何利用UDK开发游戏程序. 本课程主要分为四个部分: 1.学习UnrealScript的基本语法, 为下面的学习打下良好的基础 2.系统学习UDK的主要模块, 熟悉并掌握游戏开发的各个系统 3.使用UDK独立开发游戏Demo, 体验和理解UDK对游戏开发流程的整合 课程大纲 第一章初步接触Unreal SDK 1.1 Unreal sdk简介aaa 1.2 UC语言的基本介绍 1.3 搭建UDK的

WWDC 2014 Session笔记 - iOS界面开发的大一统

本文是我的 WWDC 2014 笔记 中的一篇,涉及的 Session 有 What's New in Cocoa Touch Building Adaptive Apps with UIKit What's New in Interface Builder View Controller Advancements in iOS 8 A Look Inside Presentation Controllers iOS 8 和 OS X 10.10 中一个被强调了多次的主题就是大一统,Apple

界面开发的三层境界

关键词:GUI框架,UI编辑器,界面引擎,MVC 第一层境界:代码写死笔者大学时候开始学习的语言是C/C++,学习完基本的概念后,后面想开发有界面的应用程序接触的是win32,你会发现创建一个窗口或者一个button控件要写好多代码,例如配置标题,位置,大小,背景颜色,icon等等各种属性,api接口一大堆参数. win32创建窗口api HWND CreateWindow( LPCTSTR lpClassName, //窗口类型名称 LPCTSTR lpWindowName, //窗口名称 D

Java 图形界面开发--图文并茂建立学生管理系统

图形用户界面(Graphics User Interface,GUI)是用户与程序交互的窗口,比命令行的界面更加直观并且更好操作. 这是本人在学习java图形界面开发阶段一步一步实现的超级简易的学生管理系统.虽然说不入大神法眼,但这确实是费了自己不少心血.对于我这样的菜鸟来说,考虑不周到,一不小心就Exception,然后就是自己调呀调.在此分享出来希望对和我一样的菜鸟有帮助. 程序完整代码下载地址见: https://github.com/chaohuangtianjie994/The-Sys

ios 界面开发中的常见元素

界面开发中的 CGPoint.CGSize.CGRect.CGRectMake.window(窗口).视图(view)简单记录 定义 /* Points. */ struct CGPoint { CGFloat x; CGFloat y; }; typedef struct CGPoint CGPoint; /* Sizes. */ struct CGSize { CGFloat width; CGFloat height; }; typedef struct CGSize CGSize; /*

ExtJs是当今最主流的前端界面开发工具之一

摘要:ExtJs是当今最主流的前端界面开发工具之一,功能强大,外观绚丽.虽然网上的开发文档很多,但是在实际应用中仍然会遇到很多问题,本文结合企业信息化.SAP ERP等实际项目开发经验,对使用ExtJs开发做了一个梳理和总结,特别对开发中遇到的重点问题进行了详细阐述,希望能够为大家提供一些帮助.    关键词:ExtJs  IMS  RIA 作用域 id冲突 风格统一1 引言    随着互联网技术的不断发展,网站的互动性越来越强,软件从C/S到B/S,又到了B/S结构的C/S界面体验,伴随着大量

界面开发与底层开发到底哪个有技术含量

今天是换部门的第一天,从之前的格式转换部门到了图像处理部门.刚刚接触图像处理,很多最基本的概念都不懂,也就做了最基本的图像处理方面的一些练习.就算是入门了吧.说说自己这些天来的感受以及对于微软和软件开发的吐槽. 记得大学做毕业设计的时候,毕设用的还是命令行界面.答辩的时候,出现了以下的对话: 老师:你是用C++写的么, 我:是啊. 老师:怎么不是图形界面.(黑框框是我对命令行界面的称呼) 我:##¥¥@@**&&& 当时我就凌乱了.好吧,如果是外行人觉得C++ == VC++ ==

基于Qt的类QQ气泡聊天的界面开发

最近在写IM 聊天界面,想设计出一个类似QQ气泡聊天的样式 使用了几种办法 1:使用Qt下面的QListview来实现QQ类似效果,差强人意 2:使用QWebview加载html css样式来完成,发现效果不错,但是毕竟webview占用巨大的内存 3:使用QTextBrower加载css,但是好像只支持css2.1版本,css3完全不支持,这样的话,花哨的样式应该是无法实现 基于以上三种思路 最后发现还是QML实现比较好,但是qml基于文本与动画图片混合显示没找到好的办法,有好的办法的希望可以

简单java web实现界面开发

有关javaweb的一个简单的登陆界面开发 这里使用的工具是eclipse.sql 2016.tomcat8 开发前需要在eclipse中完成tomcat和SQL的连接配置,这里tomcat在web项目运行时会自动的启动,下边介绍开发步骤 一.web项目的建立 打开eclipse点解File->New->Dynamic Web Project 进入以下界面,输入项目名称 点击next 再点击next,进入下一界面 将箭头指向的位置选中,点击finish及完成Web项目的创建 三.数据库建表 打