始建基于对话框的Windows应用程序(四)—— Edit
Control、Combo Box的行使、Unicode转ANSI、Open File
Dialog、文件读取、可变参数、自动滚动

制造基于对话框的Windows应用程序(四)—— Edit
Control、Combo Box的施用、Unicode转ANSI、Open File
Dialog、文件读取、可变参数、自动滚动

Creating Dialogbased Win32 Application (4) / 创设基于对话框的Win32应用程序(四)Edit Control的利用、Unicode转ANSI、自动滚动 / Win32, VC++, Windows,ansiunicode

创办基于对话框的Win32应用程序(四)——Edit
Control的行使、Unicode转ANSI、自动滚动

 

  从前的介绍中,我们用到了Button、Static
Text、Checkbox那多少个控件。这一节中大家将学习应用Edit
Control(编辑框)控件,其中还包涵Unicode转ANSI的章程、文本框自动滚动的功效等。

 

24、首先切换来Reasource
View(Ctrl+Shift+E),找到待修改的主窗体,并从Toolbox(Ctrl+Atl+X)中添加Edit
Control控件以及Button控件如下:

 澳门金沙国际 1

中间较大的Edit Box的Properties设置为:

 澳门金沙国际 2

较小的Edit Box的Properties可以维持默许设置。

变动控件ID后回想在reasource.h文件元帅多余的概念删除或注释掉:

 澳门金沙国际 3

注意:在以代码格局打开reasource.h或.rc文件后若要回到Reasource
View中查阅编辑,须先将开辟的各有关文书关闭。

25、在被调用的下令信息响应函数(Dlg_OnCommand)中添加对新增控件的响应操作。

点击Browse按钮创制Open File
Dialog,并将甄选的公文路径显示在一侧的编写框中:

 澳门金沙国际 4

其中WideCharToMultiByte函数完结了Unicode到ANSI的转换。

在Edit Control中添加文本并已毕自动滚动:

 澳门金沙国际 5

澳门金沙国际 6

按下Open按钮,根据较小编辑框中的路径读取文件,并按ANSI文本格式突显在较大编辑框中:

 澳门金沙国际 7

澳门金沙国际 8 1
#include <Windows.h> 2 #include <windowsx.h> 3 #include
<tchar.h> 4 #活动滚动,创制基于对话框的Windows应用程序。include <Shobjidl.h> 5 #include <mutex>
6 #include “Resource.h” 7 8 // Sets the dialog box icons 9 inline void
chSETDLGICONS(HWND hWnd, int idi) { 10 SendMessage(hWnd, WM_SETICON,
ICON_BIG, (LPARAM) 11 LoadIcon((HINSTANCE)GetWindowLongPtr(hWnd,
GWLP_HINSTANCE), 12 MAKEINTRESOURCE(idi))); 13 SendMessage(hWnd,
WM_SETICON, ICON_SMALL, (LPARAM) 14
LoadIcon((HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), 15
MAKEINTRESOURCE(idi))); 16 } 17 18 // The normal HANDLE_MSG macro in
WindowsX.h does not work properly for dialog 19 // boxes because DlgProc
returns a BOOL instead of an LRESULT (like 20 // WndProcs). This
chHANDLE_DLGMSG macro corrects the problem: 21 #define
chHANDLE_DLGMSG(hWnd, message, fn) \ 22 case (message): return
(SetDlgMsgResult(hWnd, uMsg, \ 23 HANDLE_##message((hWnd), (wParam),
(lParam), (fn)))) 24 25 26 // Main dialog 27 HWND g_hDlg; 28 29
std::mutex g_add; 30 // Adds a string to the “TextView” edit control 31
void AddText(PCTSTR pszFormat, …) { 32
std::lock_guard<std::mutex> lock(g_add); 33 34 va_list argList;
35 va_start(argList, pszFormat); 36 37 static TCHAR sz[10 * 1024];
38 39 Edit_GetText(GetDlgItem(g_hDlg, IDC_TEXTVIEW), sz,
_countof(sz)); 40 _vstprintf_s( 41 _tcschr(sz, TEXT(‘\0’)),
_countof(sz) – _tcslen(sz), 42 pszFormat, argList); 43
Edit_SetText(GetDlgItem(g_hDlg, IDC_TEXTVIEW), sz); 44
va_end(argList); 45 46 ::SendMessage(GetDlgItem(g_hDlg,
IDC_TEXTVIEW), 47 WM_SETREDRAW, FALSE/*闭馆重绘*/, 0); 48 49
//::SetDlgItemText(g_hDlg/*涵盖Edit Control主窗口的句柄*/, 50
//IDC_TEXTVIEW/*Edit Control资源的号子*/,
pszFormat/*要出口的新闻*/); 51 52 int iLine =
(int)::SendMessage(GetDlgItem(g_hDlg, 53 IDC_TEXTVIEW)/*Edit
Control的句柄*/, EM_GETLINECOUNT, 0/*忽略*/, 0/*忽略*/); 54
::SendMessage(GetDlgItem(g_hDlg, IDC_TEXTVIEW), 55 EM_LINESCROLL,
0/*水平滚动的字符个数*/, iLine/*笔直滚动的行数*/); 56 57 size_t
iOutputLen = _tcslen(pszFormat); 58 ::SendMessage(GetDlgItem(g_hDlg,
IDC_TEXTVIEW), EM_SETSEL, 59 iOutputLen/*要选中字符的开始位置*/,
iOutputLen/*要选中字符的了断地方*/); 60 61
::SendMessage(GetDlgItem(g_hDlg, IDC_TEXTVIEW), 62 WM_SETREDRAW,
TRUE/*开辟重绘*/, 0); 63 } 64 65 INT_PTR WINAPI NewDlg_Proc(HWND
hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 66 switch (uMsg) 67 {
68 case WM_CLOSE: 69 EndDialog(hWnd, 0); 70 break; 71 } 72 73
return(FALSE); 74 } 75 76 void Dlg_OnCommand(HWND hWnd, int id, HWND
hWndCtl, UINT codeNotify) { 77 HRESULT hr; 78 IFileDialog *pfd = NULL;
79 LPWSTR filePath = L””; 80 TCHAR file[MAX_PATH] = { 0 }; 81
COMDLG_FILTERSPEC rgSpec[] = 82 { 83 { TEXT(L”文本文档”),
TEXT(L”*.txt”) }, 84 { TEXT(L”所有文件”), TEXT(L”*.*”) } 85 }; 86 87
TCHAR buffer[10240] = { 0 }; 88 switch (id) { 89 case IDC_CHECKONTOP:
90 SetWindowPos(hWnd, IsDlgButtonChecked(hWnd, IDC_CHECKONTOP) 91 ?
HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
92 break; 93 case IDC_BROWSE: 94 hr =
CoCreateInstance(CLSID_FileOpenDialog, 95 NULL, 96
CLSCTX_INPROC_SERVER, 97 IID_PPV_ARGS(&pfd)); 98
FILEOPENDIALOGOPTIONS dwFlags; 99 hr = pfd->GetOptions(&dwFlags); 100
hr = pfd->SetOptions(dwFlags | FOS_FORCEFILESYSTEM); 101 typedef
struct _COMDLG_FILTERSPEC { 102 LPCWSTR pszName; 103 LPCWSTR pszSpec;
104 } COMDLG_FILTERSPEC; 105 hr = pfd->SetFileTypes(2, rgSpec); 106
hr = pfd->SetFileTypeIndex(1); 107 hr = pfd->Show(hWnd); 108
IShellItem * pShellItem; 109 hr = pfd->GetResult(&pShellItem); 110
if (hr == S_OK) 111 { 112 hr =
pShellItem->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &filePath);
113 WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, filePath,
MAX_PATH, file, 114 sizeof(file), NULL, NULL); 115 SetDlgItemText(hWnd,
IDC_OPENEDIT, file); 116 } 117 break; 118 case IDOPEN: 119
GetDlgItemText(hWnd, IDC_OPENEDIT, file, _countof(file)); 120 HANDLE
hFile; 121 DWORD readsize; 122 hFile = CreateFile(file, GENERIC_READ,
FILE_SHARE_READ, NULL, 123 OPEN_EXISTING, NULL, NULL); 124
ReadFile(hFile, buffer, sizeof(buffer), &readsize, NULL); 125
AddText(buffer); 126 CloseHandle(hFile); 127 break; 128 case IDCANCEL:
129 SendMessage(hWnd, WM_CLOSE, 0, 0); 130 break; 131 132 } 133 } 134
135 BOOL Dlg_OnInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam) {
136 g_hDlg = hWnd; 137 138 chSETDLGICONS(hWnd, IDI_ICON1); 139 140
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE |
SWP_NOSIZE); 141 CheckDlgButton(hWnd, IDC_CHECKONTOP, BST_CHECKED);
142 143 return(TRUE); 144 } 145 146 INT_PTR WINAPI Dlg_Proc(HWND hWnd,
UINT uMsg, WPARAM wParam, LPARAM lParam) { 147 switch (uMsg) 148 { 149
chHANDLE_DLGMSG(hWnd, WM_INITDIALOG, Dlg_OnInitDialog); 150
chHANDLE_DLGMSG(hWnd, WM_COMMAND, Dlg_OnCommand); 151 case WM_CLOSE:
152 EndDialog(hWnd, 0); 153 break; 154 } 155 156 return(FALSE); 157 }
158 159 int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR
pszCmdLine, int) { 160 DialogBoxParam(hinstExe,
MAKEINTRESOURCE(IDD_DIALOG), 161 NULL, Dlg_Proc, _ttoi(pszCmdLine));
162 163 return(0); 164 } Win32WindowsApplication.cpp

26、此时按下F5 Start Debugging,能够检验所需作用皆已成功。

————————————————

本文为自个儿原创,转发请声明出处。

Dialogbased Win32 Application (4) /
创制基于对话框的Win32应用程序(四)Edit
Control的选取、Unicode转ANSI、自动滚动 / Win32, VC++,
Windows,ansiun…

一、前言

  作为第三篇的尾声一有些,大家来看一下Qt的控件,谈到控件,就会令人想到界面的雅观性和易操作性,进而想到开发的便捷性。作为windows界面开发的MFC曾经是风靡了略微年,不过其弊端也随着其余界面库的面世而不断的被放大,对于一个刚学会C大概C++转而读书windows界面开发的新手来说,MFC的控件和界面设计抽象而且复杂,只怕现在您还记得MFC控件重绘比任何界面库多消费的光阴,走过的弯路,调过的bug。由此,大家前几天来看看Qt会不会带给大家不一样的心得,Let‘s
go。

  

  

二、控件介绍

  从前的介绍中,我们用到了Button、Static
Text、Checkbox那多少个控件。这一节中大家将学习运用Edit
Control(编辑框)、Combo
Box控件,其中还包括Unicode转ANSI的措施、创制Open File Dialog、
读取文件、可变参数(那里用于转移日志)、文本框自动滚动的功效等。 

  从前的牵线中,大家用到了Button、Static
Text、Checkbox那三个控件。这一节中大家将学习应用Edit
Control(编辑框)、Combo
Box控件,其中还包罗Unicode转ANSI的措施、成立Open File Dialog、
读取文件、可变参数(那里用于转移日志)、文本框自动滚动的成效等。 

2.1 按钮组(Buttons)

  对于按钮的彰显和操作,我们直接通过图片和代码的点子来体现。

澳门金沙国际 9

Push Button:按钮

Tool Button:工具按钮

Radio Button:单选按钮

Check Box:复选框

Command Link Button:命令连接按钮

Dialog Button Box:窗口按钮盒

2.1.1 按钮实例

澳门金沙国际 10澳门金沙国际 11

 1 #include "mywidegt.h"
 2 #include <QApplication>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     QApplication a(argc, argv);
 7     MyWidegt w;
 8     /*设置主窗体的位置和初始大小*/
 9     w.setGeometry(100,100,200,100);
10     w.show();
11     return a.exec();
12 }

main.cpp

澳门金沙国际 12澳门金沙国际 13

 1 #ifndef MYWIDEGT_H
 2 #define MYWIDEGT_H
 3 
 4 #include <QWidget>
 5 
 6 class MyWidegt : public QWidget
 7 {
 8     Q_OBJECT
 9 
10 public:
11     MyWidegt(QWidget *parent = 0);
12     ~MyWidegt();
13 };
14 
15 #endif // MYWIDEGT_H

mywidegt.h

澳门金沙国际 14澳门金沙国际 15

 1 #include "mywidegt.h"
 2 #include <qapplication.h>
 3 #include <qpushbutton.h>
 4 #include <qfont.h>
 5 
 6 MyWidegt::MyWidegt(QWidget *parent)
 7     : QWidget(parent)
 8 {
 9     /*设置对话框的最小显示尺寸*/
10     setMinimumSize(200,120);
11     /*设置对话框的最大显示尺寸*/
12     setMaximumSize(1366,768);
13     /*PushButton的构造函数
14     QPushButton::QPushButton(const QString & text, QWidget * parent = 0)
15     */
16     QPushButton *quit=new QPushButton("Quit",this);
17     /*setGeometry(int x, int y, int w, int h)从坐标(x,y)开始显示一个w*h大小的界面,范围不能超过上面设置的尺寸*/
18     quit->setGeometry(62,40,75,30);
19     /*设置字体    void    setFont(const QFont &)*/
20     quit->setFont(QFont("Times",18,QFont::Bold));
21 
22     connect(quit,SIGNAL(clicked()),qApp,SLOT(quit()));
23 
24 }
25 
26 MyWidegt::~MyWidegt()
27 {
28 
29 }

mywidegt.cpp

澳门金沙国际 16

24、首先切换来Reasource
View(Ctrl+Shift+E),找到待修改的主窗体,并从Toolbox(Ctrl+Atl+X)中添加Edit
Control、Combo Box、Button控件如下:

24、首先切换来Reasource
View(Ctrl+Shift+E),找到待修改的主窗体,并从Toolbox(Ctrl+Atl+X)中添加Edit
Control、Combo Box、Button控件如下:

2.2 输入控件组(Input Widegets)

输入控件组(Input Widegets)包蕴的顺序控件的名目依次如图所示

澳门金沙国际 17

              Combo Box: 组合框

     Font Combo Box: 字体组合框

     Line Edit: 行编辑

     Text Edit: 文本编辑

     Plain Text Edit:文本编辑

     Spin Box: 数字展现框(自旋盒)

     Double Spin Box: 双自旋盒

     Time  Edit: 时间编排

     Date Edit: 日期编辑

     Date/Time Edit: 日期/时间编排

     Dial:拨号

     Horizontal Scroll Bar: 横向滚动条

     Vertical Scroll Bar:垂直滚动条

                  Horizontal Slider: 横向滑块

                  Vertical Slider:垂直滑块

                  Key Sequence Edit:火速键编辑 

 澳门金沙国际 18

 澳门金沙国际 19

2.2.1 控件类介绍

1、QDateTime类

  在Qt5中,可以接纳QDate提姆e类类获取系统的时光。通过Qdate提姆e::currentDateTime()来赢得当地系统的年华和日期吸纳好。可以经过date()和time()来回到datetime中的日期和岁月有些,代码如下。

1 Qlabel *datalabel = new Qlabel();
2 QdateTime *datatime=new QdateTime(QdateTime::currentDateTime());
3 datalabel->setText(datatime->date().toString());
4 datalabel->show();

2、Qtimer类

  定时器(Qtimer)的利用很不难,只须求以下多少个步骤就可以达成定时器的施用。

  (1)新建一个定时器

QTimer *time_clock=new Qtimer(parent);

  (2)连接这一个定时器的信号和槽,利用定时器的timeout()。

connect(time_clock,SIGNAL(timeout()),this,SLOT(slottimedone()));

  定时时间一到就会发送timeout()信号,从而出发slottimedone()槽去做到某件事情。

  (3)开启定时器,并设定定时周期

  开启定时器有二种办法,start(int
time)和setSingelShot(true)。其中,第一种表示每隔“time”秒就会重启定时器,可以另行出发定时,利用stop()将定时器关闭;而setSingleShot(true)则是仅启动定时器一遍。工程中常用的是前者,比如
time_clock->start(2000);

其中Edit Box的Properties设置为:

其中Edit Box的Properties设置为:

2.3 展现控件组(Display Widegts)

澳门金沙国际 20       
Lbael:标签

        Text Browser:文本浏览器

        Graphics View:图形视图

        Calendar: 日历

        LCD Number:液晶数字

                     Progress Bar:进度条

                     Horizontal Line:水平线

                     Vertical Line:垂直线

                     QDeclarativeView:向QML揭发数据视图

        QQuickWidegt:快捷布局

                     QWebView:web视图

 

 澳门金沙国际 21

 澳门金沙国际 22

2.3.1 控件类介绍

(1)Graphics View对应于QGraphicsView类

(2)Text
Browser对应于QTextBrowser类。QTextBrowser类继承自QTextEdit,而且近视只读的,对峙面的情节并不能够开展改动,可是相对于QTextEdit来讲,它还保有链接文本的成效。

点击Combo Box左侧三角箭头可以调整其下拉框的轻重缓急:

点击Combo Box左侧三角箭头可以调动其下拉框的分寸:

2.4 空间间隔组(Spacers)

澳门金沙国际 23    Horizontal
Spacer
:水平距离

    Vertical Spacer:垂直间隔

 

 澳门金沙国际 24

 澳门金沙国际 25

2.5  布局管理组(Layouts)

澳门金沙国际 26    Vertical Layout
垂直布局

    Horizontal Layout:横向(水平)布局

    Grid Layout:网格布局

    Form Layout: 表格布局

改变控件ID后记得在reasource.h文件中将多余的概念删除或注释掉:

转移控件ID后记得在reasource.h文件司令员多余的定义删除或注释掉:

2.6 容器组(Containers)

澳门金沙国际 27        Group
Box
:组框

        Scroll Area:滚动区域

        Tool   Box:工具箱

        Tab Widget:标签小部件

        Stacked Widegt:堆叠部件

        Frame :帧

        Widget:小部件

        MdiArea:MDI区域

      Dock Widget:停靠窗口部件

      QAxWidget:封装Flash的ActiveX控件

 澳门金沙国际 28

 澳门金沙国际 29

2.7 项目视图组(Item Views)

澳门金沙国际 30   List View:清单视图

   Tree View:树视图

   Tabel View:表视图

   Column View:列视图

专注:在以代码情势打开reasource.h或.rc文件后若要回到Reasource
View中查阅编辑,须先将开辟的各相关文书关闭。

小心:在以代码方式打开reasource.h或.rc文件后若要回到Reasource
View中查看编辑,须先将打开的各相关文件关闭。

2.8连串控件组(Item Widgets)

澳门金沙国际 31    List
Widegt
:清单控件

    Tree Widegt:树形控件

    Tabel Widegt:表控件

 

25、在被调用的指令新闻响应函数(Dlg_OnCommand)中添加对Browse按钮的响应动作。

25、在被调用的下令音讯响应函数(Dlg_OnCommand)中添加对Browse按钮的响应动作。

三、 综合样例

澳门金沙国际 32

 1 #ifndef DIALOG_H
 2 #define DIALOG_H
 3 
 4 #include <QDialog>
 5 
 6 namespace Ui {
 7 class Dialog;
 8 }
 9 
10 class Dialog : public QDialog
11 {
12     Q_OBJECT
13 
14 public:
15     explicit Dialog(QWidget *parent = 0);
16     ~Dialog();
17 
18 private:
19     Ui::Dialog *ui;
20 private slots:
21     void on_lineEdit_textChanged();
22 };
23 
24 #endif // DIALOG_H

 1 #include "dialog.h"
 2 #include "ui_dialog.h"
 3 
 4 Dialog::Dialog(QWidget *parent) :
 5     QDialog(parent),
 6     ui(new Ui::Dialog)
 7 {
 8     ui->setupUi(this);
 9     /*只允许第一个字元输入大小写英文字母,后面接一位非0的数字,再接0~2位可为0的数字*/
10     QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");
11     //设置验证器,即只能输入正则要求的类型的输入
12     ui->lineEdit->setValidator(new QRegExpValidator(regExp,this));
13     connect(ui->okButton,SIGNAL(clicked()),this,SLOT(accept()));
14     connect(ui->cancelButton,SIGNAL(clicked()),this,SLOT(reject()));
15    
16 }
17 
18 Dialog::~Dialog()
19 {
20     delete ui;
21 }
22 
23 void Dialog::on_lineEdit_textChanged()
24 {
25     //当编辑框检测到有输入时,将ok按钮设置为可用
26     ui->okButton->setEnabled(ui->lineEdit->hasAcceptableInput());
27 }

点击Browse按钮将创造Open File
Dialog,并将选取的文书路径显示在边缘的Combo Box中:

点击Browse按钮将开创Open File
Dialog,并将甄选的文书路径彰显在边上的Combo Box中:

 四、 小结

  好了,到了此地关于模板库、工具类和控件的情节就基本说完了,详细的始末和重大会在后头的学习中相应的装有提及,最后希望团结可以学得入木三分,也意在读者可以读完所有收获。澳门金沙国际 33

澳门金沙国际 34

 澳门金沙国际 35

 澳门金沙国际 36

里面WideCharToMultiByte函数落成了Unicode到ANSI的转移。

个中WideCharToMultiByte函数已毕了Unicode到ANSI的变换。

26、已毕在Edit Control中添加文本并完毕自动滚动:

26、完毕在Edit Control中添Gavin本并促成全自动滚动:

 澳门金沙国际 37

 澳门金沙国际 38

澳门金沙国际 39

澳门金沙国际 40

中间当“count ==
0”时,将屏蔽可变参数的使用。关于可变参数的使用可以在前边的代码中看看。

其中当“count ==
0”时,将屏蔽可变参数的运用。关于可变参数的行使可以在前边的代码中看看。

按下Open按钮,将依照Combo
Box中的路径读取文件,并按ANSI文本格式突显在Edit Control中:

澳门金沙国际,按下Open按钮,将基于Combo
Box中的路径读取文件,并按ANSI文本格式呈现在Edit Control中:

 澳门金沙国际 41

 澳门金沙国际 42

澳门金沙国际 43澳门金沙国际 44

澳门金沙国际 45澳门金沙国际 46

  1 #include <Windows.h>
  2 #include <windowsx.h>
  3 #include <tchar.h>
  4 #include <Shobjidl.h>
  5 #include <mutex>
  6 #include <string>
  7 #include "Resource.h"
  8 
  9 // Sets the dialog box icons
 10 inline void chSETDLGICONS(HWND hWnd, int idi) {
 11     SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)
 12         LoadIcon((HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
 13             MAKEINTRESOURCE(idi)));
 14     SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)
 15         LoadIcon((HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
 16             MAKEINTRESOURCE(idi)));
 17 }
 18 
 19 // The normal HANDLE_MSG macro in WindowsX.h does not work properly for dialog
 20 // boxes because DlgProc returns a BOOL instead of an LRESULT (like
 21 // WndProcs). This chHANDLE_DLGMSG macro corrects the problem:
 22 #define chHANDLE_DLGMSG(hWnd, message, fn)                 \
 23    case (message): return (SetDlgMsgResult(hWnd, uMsg,     \
 24       HANDLE_##message((hWnd), (wParam), (lParam), (fn))))
 25 
 26 // Main dialog
 27 HWND     g_hDlg;
 28 
 29 std::mutex g_add;
 30 // Adds a string to the "TextView" edit control
 31 // Disable "..." when "count == 0", otherwise
 32 // "count" can't be smaller than the (formatted) string size
 33 void AddText(DWORD count, PCTSTR pszFormat, ...) {
 34     std::lock_guard<std::mutex> lock(g_add);
 35 
 36     static std::string text;
 37 
 38     if (count == 0)
 39     {
 40         text.append(pszFormat);
 41     }
 42     else
 43     {
 44         va_list argList;
 45         va_start(argList, pszFormat);
 46         TCHAR *sz = new TCHAR[count];
 47         memset(sz, '\0', count);
 48         _vstprintf_s(sz, count, pszFormat, argList);
 49         va_end(argList);
 50         text.append(sz);
 51         delete[] sz;
 52     }
 53 
 54     HWND hEdit = GetDlgItem(g_hDlg, IDC_TEXTVIEW);
 55     ::SendMessage(hEdit,
 56         WM_SETREDRAW, FALSE/*关闭重绘*/, 0);
 57 
 58     //Edit_SetText(hEdit, text.c_str());
 59     //::SetDlgItemText(g_hDlg/*包含Edit Control主窗口的句柄*/, 
 60     //IDC_TEXTVIEW/*Edit Control资源的编号*/, text.c_str()/*要输出的信息*/);
 61     ::SendMessage(hEdit, WM_SETTEXT, false, (LPARAM)text.c_str());
 62 
 63     int iLine = (int)::SendMessage(GetDlgItem(g_hDlg, 
 64         IDC_TEXTVIEW)/*Edit Control的句柄*/, EM_GETLINECOUNT, 0/*忽略*/, 0/*忽略*/);
 65     ::SendMessage(hEdit, EM_LINESCROLL, 0/*水平滚动的字符个数*/, 
 66         iLine/*垂直滚动的行数*/);
 67     size_t iOutputLen = _tcslen(pszFormat);
 68     ::SendMessage(hEdit, EM_SETSEL, iOutputLen/*要选中字符的起始位置*/, 
 69         iOutputLen/*要选中字符的结束位置*/);
 70 
 71     ::SendMessage(hEdit, WM_SETREDRAW, TRUE/*打开重绘*/, 0);
 72 }
 73 
 74 INT_PTR WINAPI NewDlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
 75     switch (uMsg)
 76     {
 77     case WM_CLOSE:
 78         EndDialog(hWnd, 0);
 79         break;
 80     }
 81 
 82     return(FALSE);
 83 }
 84 
 85 void Dlg_OnCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify) {
 86     HRESULT hr;
 87     IFileDialog *pfd = NULL;
 88     LPWSTR filePath = L"";
 89     TCHAR file[MAX_PATH] = { 0 };
 90     COMDLG_FILTERSPEC rgSpec[] =
 91     {
 92         { TEXT(L"文本文档"), TEXT(L"*.txt") },
 93         { TEXT(L"所有文件"), TEXT(L"*.*") }
 94     };
 95     TCHAR* buffer;
 96     DWORD filesize;
 97     HWND hWndComboBox;
 98     static unsigned int num = 1;
 99     switch (id) {
100     case IDC_CHECKONTOP:
101         SetWindowPos(hWnd, IsDlgButtonChecked(hWnd, IDC_CHECKONTOP)
102             ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
103         break;
104     case IDC_BROWSE:
105         hr = CoCreateInstance(CLSID_FileOpenDialog,
106             NULL,
107             CLSCTX_INPROC_SERVER,
108             IID_PPV_ARGS(&pfd));
109         FILEOPENDIALOGOPTIONS dwFlags;
110         hr = pfd->GetOptions(&dwFlags);
111         hr = pfd->SetOptions(dwFlags | FOS_FORCEFILESYSTEM);
112         hr = pfd->SetFileTypes(2, rgSpec);
113         hr = pfd->SetFileTypeIndex(1);
114         hr = pfd->Show(hWnd);
115         IShellItem * pShellItem;
116         hr = pfd->GetResult(&pShellItem);
117         if (hr == S_OK)
118         {
119             hr = pShellItem->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &filePath);
120             WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, filePath, MAX_PATH, file, 
121                 sizeof(file), NULL, NULL);
122             SetDlgItemText(hWnd, IDC_EDITCOMBO, file);
123         }
124         break;
125     case IDOPEN:
126         GetDlgItemText(hWnd, IDC_EDITCOMBO, file, _countof(file));
127         hWndComboBox = GetDlgItem(hWnd, IDC_EDITCOMBO);
128         SendMessage(hWndComboBox, CB_ADDSTRING, 0, (LPARAM)file);
129         HANDLE hFile;
130         DWORD readsize;
131         hFile = CreateFile(file, GENERIC_READ, FILE_SHARE_READ, NULL, 
132             OPEN_EXISTING, NULL, NULL);
133         if (hFile == INVALID_HANDLE_VALUE)
134         {
135             CloseHandle(hFile);
136             break;
137         }
138         filesize = GetFileSize(hFile, NULL);
139         buffer = new char[filesize + 1];
140         ReadFile(hFile, buffer, filesize, &readsize, NULL);
141         buffer[filesize] = 0;
142         AddText(MAX_PATH + 32, _T("NO.%03d %s\r\n\r\n"), num, file);
143         num++;
144         AddText(0, buffer);
145         delete[] buffer;
146         AddText(0, "\r\n\r\n");
147         CloseHandle(hFile);
148         break;
149     case IDCANCEL:
150         SendMessage(hWnd, WM_CLOSE, 0, 0);
151         break;
152 
153     }
154 }
155 
156 BOOL Dlg_OnInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam) {
157     g_hDlg = hWnd;
158     
159     chSETDLGICONS(hWnd, IDI_ICON1);
160 
161     SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
162     CheckDlgButton(hWnd, IDC_CHECKONTOP, BST_CHECKED);
163 
164     return(TRUE);
165 }
166 
167 INT_PTR WINAPI Dlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
168     switch (uMsg)
169     {
170         chHANDLE_DLGMSG(hWnd, WM_INITDIALOG, Dlg_OnInitDialog);
171         chHANDLE_DLGMSG(hWnd, WM_COMMAND, Dlg_OnCommand);
172     case WM_CLOSE:
173         EndDialog(hWnd, 0);
174         break;
175     }
176 
177     return(FALSE);
178 }
179 
180 int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) {
181     DialogBoxParam(hinstExe, MAKEINTRESOURCE(IDD_DIALOG),
182         NULL, Dlg_Proc, _ttoi(pszCmdLine));
183 
184     return(0);
185 }
  1 #include <Windows.h>
  2 #include <windowsx.h>
  3 #include <tchar.h>
  4 #include <Shobjidl.h>
  5 #include <mutex>
  6 #include <string>
  7 #include "Resource.h"
  8 
  9 // Sets the dialog box icons
 10 inline void chSETDLGICONS(HWND hWnd, int idi) {
 11     SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)
 12         LoadIcon((HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
 13             MAKEINTRESOURCE(idi)));
 14     SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)
 15         LoadIcon((HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
 16             MAKEINTRESOURCE(idi)));
 17 }
 18 
 19 // The normal HANDLE_MSG macro in WindowsX.h does not work properly for dialog
 20 // boxes because DlgProc returns a BOOL instead of an LRESULT (like
 21 // WndProcs). This chHANDLE_DLGMSG macro corrects the problem:
 22 #define chHANDLE_DLGMSG(hWnd, message, fn)                 \
 23    case (message): return (SetDlgMsgResult(hWnd, uMsg,     \
 24       HANDLE_##message((hWnd), (wParam), (lParam), (fn))))
 25 
 26 // Main dialog
 27 HWND     g_hDlg;
 28 
 29 std::mutex g_add;
 30 // Adds a string to the "TextView" edit control
 31 // Disable "..." when "count == 0", otherwise
 32 // "count" can't be smaller than the (formatted) string size
 33 void AddText(DWORD count, PCTSTR pszFormat, ...) {
 34     std::lock_guard<std::mutex> lock(g_add);
 35 
 36     static std::string text;
 37 
 38     if (count == 0)
 39     {
 40         text.append(pszFormat);
 41     }
 42     else
 43     {
 44         va_list argList;
 45         va_start(argList, pszFormat);
 46         TCHAR *sz = new TCHAR[count];
 47         memset(sz, '\0', count);
 48         _vstprintf_s(sz, count, pszFormat, argList);
 49         va_end(argList);
 50         text.append(sz);
 51         delete[] sz;
 52     }
 53 
 54     HWND hEdit = GetDlgItem(g_hDlg, IDC_TEXTVIEW);
 55     ::SendMessage(hEdit,
 56         WM_SETREDRAW, FALSE/*关闭重绘*/, 0);
 57 
 58     //Edit_SetText(hEdit, text.c_str());
 59     //::SetDlgItemText(g_hDlg/*包含Edit Control主窗口的句柄*/, 
 60     //IDC_TEXTVIEW/*Edit Control资源的编号*/, text.c_str()/*要输出的信息*/);
 61     ::SendMessage(hEdit, WM_SETTEXT, false, (LPARAM)text.c_str());
 62 
 63     int iLine = (int)::SendMessage(GetDlgItem(g_hDlg, 
 64         IDC_TEXTVIEW)/*Edit Control的句柄*/, EM_GETLINECOUNT, 0/*忽略*/, 0/*忽略*/);
 65     ::SendMessage(hEdit, EM_LINESCROLL, 0/*水平滚动的字符个数*/, 
 66         iLine/*垂直滚动的行数*/);
 67     size_t iOutputLen = _tcslen(pszFormat);
 68     ::SendMessage(hEdit, EM_SETSEL, iOutputLen/*要选中字符的起始位置*/, 
 69         iOutputLen/*要选中字符的结束位置*/);
 70 
 71     ::SendMessage(hEdit, WM_SETREDRAW, TRUE/*打开重绘*/, 0);
 72 }
 73 
 74 INT_PTR WINAPI NewDlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
 75     switch (uMsg)
 76     {
 77     case WM_CLOSE:
 78         EndDialog(hWnd, 0);
 79         break;
 80     }
 81 
 82     return(FALSE);
 83 }
 84 
 85 void Dlg_OnCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify) {
 86     HRESULT hr;
 87     IFileDialog *pfd = NULL;
 88     LPWSTR filePath = L"";
 89     TCHAR file[MAX_PATH] = { 0 };
 90     COMDLG_FILTERSPEC rgSpec[] =
 91     {
 92         { TEXT(L"文本文档"), TEXT(L"*.txt") },
 93         { TEXT(L"所有文件"), TEXT(L"*.*") }
 94     };
 95     TCHAR* buffer;
 96     DWORD filesize;
 97     HWND hWndComboBox;
 98     static unsigned int num = 1;
 99     switch (id) {
100     case IDC_CHECKONTOP:
101         SetWindowPos(hWnd, IsDlgButtonChecked(hWnd, IDC_CHECKONTOP)
102             ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
103         break;
104     case IDC_BROWSE:
105         hr = CoCreateInstance(CLSID_FileOpenDialog,
106             NULL,
107             CLSCTX_INPROC_SERVER,
108             IID_PPV_ARGS(&pfd));
109         FILEOPENDIALOGOPTIONS dwFlags;
110         hr = pfd->GetOptions(&dwFlags);
111         hr = pfd->SetOptions(dwFlags | FOS_FORCEFILESYSTEM);
112         hr = pfd->SetFileTypes(2, rgSpec);
113         hr = pfd->SetFileTypeIndex(1);
114         hr = pfd->Show(hWnd);
115         IShellItem * pShellItem;
116         hr = pfd->GetResult(&pShellItem);
117         if (hr == S_OK)
118         {
119             hr = pShellItem->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &filePath);
120             WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, filePath, MAX_PATH, file, 
121                 sizeof(file), NULL, NULL);
122             SetDlgItemText(hWnd, IDC_EDITCOMBO, file);
123         }
124         break;
125     case IDOPEN:
126         GetDlgItemText(hWnd, IDC_EDITCOMBO, file, _countof(file));
127         hWndComboBox = GetDlgItem(hWnd, IDC_EDITCOMBO);
128         SendMessage(hWndComboBox, CB_ADDSTRING, 0, (LPARAM)file);
129         HANDLE hFile;
130         DWORD readsize;
131         hFile = CreateFile(file, GENERIC_READ, FILE_SHARE_READ, NULL, 
132             OPEN_EXISTING, NULL, NULL);
133         if (hFile == INVALID_HANDLE_VALUE)
134         {
135             CloseHandle(hFile);
136             break;
137         }
138         filesize = GetFileSize(hFile, NULL);
139         buffer = new char[filesize + 1];
140         ReadFile(hFile, buffer, filesize, &readsize, NULL);
141         buffer[filesize] = 0;
142         AddText(MAX_PATH + 32, _T("NO.%03d %s\r\n\r\n"), num, file);
143         num++;
144         AddText(0, buffer);
145         delete[] buffer;
146         AddText(0, "\r\n\r\n");
147         CloseHandle(hFile);
148         break;
149     case IDCANCEL:
150         SendMessage(hWnd, WM_CLOSE, 0, 0);
151         break;
152 
153     }
154 }
155 
156 BOOL Dlg_OnInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam) {
157     g_hDlg = hWnd;
158     
159     chSETDLGICONS(hWnd, IDI_ICON1);
160 
161     SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
162     CheckDlgButton(hWnd, IDC_CHECKONTOP, BST_CHECKED);
163 
164     return(TRUE);
165 }
166 
167 INT_PTR WINAPI Dlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
168     switch (uMsg)
169     {
170         chHANDLE_DLGMSG(hWnd, WM_INITDIALOG, Dlg_OnInitDialog);
171         chHANDLE_DLGMSG(hWnd, WM_COMMAND, Dlg_OnCommand);
172     case WM_CLOSE:
173         EndDialog(hWnd, 0);
174         break;
175     }
176 
177     return(FALSE);
178 }
179 
180 int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) {
181     DialogBoxParam(hinstExe, MAKEINTRESOURCE(IDD_DIALOG),
182         NULL, Dlg_Proc, _ttoi(pszCmdLine));
183 
184     return(0);
185 }

Win32WindowsApplication.cpp

Win32WindowsApplication.cpp

26、此时按下F5 Start Debugging,能够检验所需成效皆已到位。

26、此时按下F5 Start Debugging,可以检验所需功效皆已到位。

————————————————

————————————————

本文为自我原创,转发请注脚出处。

正文为我原创,转发请评释出处。

 

 

相关文章