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

创建基于对话框的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控件如下:

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

较小的Edit Box的Properties可以保持默认设置。

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

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

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

点击Browse按钮创建Open File Dialog,并将选取的文件路径显示在一旁的编辑框中:

其中WideCharToMultiByte函数实现了Unicode到ANSI的转换。

在Edit Control中添加文本并实现自动滚动:

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

  1 #include <Windows.h>
  2 #include <windowsx.h>
  3 #include <tchar.h>
  4 #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,可以检验所需功能皆已完成。

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

本文为本人原创,转载请注明出处。

时间: 2024-10-29 17:05:15

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

Creating Dialogbased Win32 Application (1) / 创建基于对话框的Win32应用程序(一)新建窗体 / Win32, VC++, Windows

创建基于对话框的Win32应用程序(一) —— 新建窗体 1.新建一个Visual C++的Empty Project.  2.在Solution Explorer中右键Add New Item,添加 .cpp 文件,并提供Win32应用程序的入口点函数.  3.在Solution Explorer或 Resources View 中右键Add Resource,选择Dialog.并在修改相关内容. 4.切换到 .cpp文件中,创建回调函数(Dlg_Proc),并在入口点函数中调用DialogB

Creating Dialogbased Win32 Application (2) / 创建基于对话框的Win32应用程序(二)Button的应用、新建子窗体 / Win32, VC++, Windows

创建基于对话框的Win32应用程序(二) —— Button的应用.新建子窗体 可以发现上一节创建的窗体中,点击OK和Cancel两个按钮是没有任何反应的.现在我们来为他们添加退出对话框的功能. 6.首先定义宏替换如下: 7.再在回调函数(Dlg_Proc)中调用响应消息的函数(Dlg_OnCommand)如下: 8.由于HANDLE_WM_COMMAND是在windowsx.h头文件中定义的,故添加其引用. 9.接下来定义刚才调用的消息响应函数(Dlg_OnCommand)如下: 其中IDOK

[转]隐藏基于对话框的MFC应用程序窗口的方法

隐藏基于对话框的MFC应用程序窗口的方法 (推荐这个方法,非常好用) 很多人可能会将窗口创建出来,然后用一个 ShowWindow(SW_HIDE) 的方法去隐藏窗口,当然这是可以做到隐藏的功能,但是有一点不足的地方就是窗口在隐藏之前会有一下短瞬的闪烁,而以下这种方法可以解决这种问题: 在 C***App::InitInstance() 的函数中将以下的这一段注释掉: C***Dlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); i

隐藏基于对话框的MFC应用程序窗口的方法

隐藏基于对话框的MFC应用程序窗口的方法 (推荐这个方法,非常好用) 很多人可能会将窗口创建出来,然后用一个 ShowWindow(SW_HIDE) 的方法去隐藏窗口,当然这是可以做到隐藏的功能,但是有一点不足的地方就是窗口在隐藏之前会有一下短瞬的闪烁,而以下这种方法可以解决这种问题: 在 C***App::InitInstance() 的函数中将以下的这一段注释掉: C***Dlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); i

QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例

QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例 部分代码: // 创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束 QMenu *pDialog = mBar->addMenu(QString::fromLocal8Bit("对话框")); QAction *pTopDialog = pDialog->addAction(QString::fromLocal8Bit("模态对话框")); connect(pTopDialog,

猎豹MFC--书籍推荐:基于对话框的MFC应用程序《VisualC++实例精通》单文档多文档多顶级文档《MFCWindows程序设计》

来自为知笔记(Wiz)

FireFox Prevent this page from creating addtional dialogs 火狐浏览器 设置 阻止此页面创建更多对话框

FireFox英文版本老弹出“Prevent this page from creating addtional dialogs”的确认框 FireFox english version alert “Prevent this page from creating addtional dialogs”  to avoid the alert method: Copy the preference name= dom.successive_dialog_time_limit Open Firefo

创建MFC应用程序的类型:单文档+多文档+基于对话框

单文档支持文档视图架构,数据的保存--(读取--修改)文档类功能--显示(视图类功能),比较方便. 基于对话框,主窗口是对话框类型,可以方便的使用控件,所见即所得的编程,比较方便. 单文档类似"记事本"这样的应用程序,是文件处理软件的开发基础,只是每个应用程序仅处理一个文档(与多文档相比较). 基于对话框类似"计算器"这样的应用程序,没有需要处理的文档,一般是工具软件的开发基础. 基于对话框(3个类): CAboutDlg 程序名App 程序名Dlg 单文档(5个类

Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法

原文:Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法 Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我们讲了Raspberry安装Win10 IoT系统及搭建Visual Studio 2015开发环境的方法(http://www.cnblogs.com/cloudtech/p/5562120.html)