#ifndef __03022006__WIN32INPUTBOX__
#define __03022006__WIN32INPUTBOX__ /* This library is (c) Elias Bachaalany aka lallous <lallousx86@yahoo.com>
You may use this library under the following license agreement: The zlib/libpng License.
---------------------------
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications,
and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented;
you must not claim that you wrote the original software.
If you use this software in a product, an acknowledgment in the product
documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such,
and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution. */ #include <windows.h>
#include <tchar.h> class CWin32InputBox; // Structure used to orient the inputbox behavior
struct WIN32INPUTBOX_PARAM
{
friend class CWin32InputBox; //
IN OPTIONAL bool bMultiline; // Pass this as none zero so to use this memory dlg template
IN OPTIONAL LPVOID DlgTemplateData; // Pass this as none ZERO so to load DLGTEMPLATE from resources
IN OPTIONAL LPCTSTR DlgTemplateName; // passing both "DlgTemplateName" and "DlgTemplateData" ZERO will cause
// the dialog to use his default embedded resource // Center on monitor or owner window?
IN OPTIONAL bool bCenter; // Want to add more styles to the dialog?
IN OPTIONAL DWORD dwStylesPlus, dwStylesMinus;
IN OPTIONAL DWORD dwExStylesPlus, dwExStylesMinus; IN LPCTSTR szTitle, szPrompt; // Return buffer
OUT LPTSTR szResult;
IN DWORD nResultSize; // Owner window
HWND hwndOwner;
HINSTANCE hInstance; short xPos, yPos; WIN32INPUTBOX_PARAM();
private:
HWND hDlg;
}; class CWin32InputBox
{
private:
WIN32INPUTBOX_PARAM *_param;
static LRESULT CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
HWND _hwndEditCtrl; void InitDialog();
void SetParam(WIN32INPUTBOX_PARAM *);
WIN32INPUTBOX_PARAM * GetParam(); public: CWin32InputBox(WIN32INPUTBOX_PARAM *);
~CWin32InputBox(); static INT_PTR InputBoxEx(WIN32INPUTBOX_PARAM *);
static INT_PTR InputBox(
LPCTSTR szTitle,
LPCTSTR szPrompt,
LPTSTR szResult,
DWORD nResultSize,
bool bMultiLine = false,
HWND hwndParent = );
}; #endif
#include "Win32InputBox.h"
#include <stdio.h> #pragma warning (disable: 4312) /*
History
----------
03/02/2006
- Initial version development 03/04/2006
- Lessened the complexity of the class, made it less generic (since its purpose is to be simple)
- Updated the dialog template and made OK button as default button */ typedef struct _MSDN_DLGTEMPLATEEX
{
WORD dlgVer;
WORD signature;
DWORD helpID;
DWORD exStyle;
DWORD style;
WORD cDlgItems;
short x;
short y;
short cx;
short cy;
BYTE _rest[]; // rest of structure
} MSDN_DLGTEMPLATEEX; static bool IsDlgTemplateExtended(DLGTEMPLATE *dlgTemplate)
{
MSDN_DLGTEMPLATEEX *dgExTemplate = (MSDN_DLGTEMPLATEEX *) dlgTemplate; // MSDN excerpt:
//* dlgVer
// Specifies the version number of the extended dialog box template. This member must be 1.
//* signature
// Indicates whether a template is an extended dialog box template.
// If signature is 0xFFFF, this is an extended dialog box template.
// In this case, the dlgVer member specifies the template version number.
// If signature is any value other than 0xFFFF, this is a standard dialog box template that uses the DLGTEMPLATE and DLGITEMTEMPLATE structures. return (dgExTemplate->dlgVer == ) && (dgExTemplate->signature == 0xFFFF);
} // Use alignment if supported by the compiler
#ifdef _MSC_VER
#if _MSC_VER > 1200
__declspec(align())
#endif
#endif // per the MSDN, the DLGTEMPLATE must be DWORD aligned
// this was generated by the DlgResToDlgTemplate tool
static unsigned char definputbox_dlg[] =
{
0x01,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0xc8,0x00,0x06,
0x00,0x16,0x00,0x11,0x00,0xe7,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x57,0x00,0x69,
0x00,0x6e,0x00,0x33,0x00,0x32,0x00,0x49,0x00,0x6e,0x00,0x70,0x00,0x75,0x00,0x74,
0x00,0x42,0x00,0x6f,0x00,0x78,0x00,0x00,0x00,0x08,0x00,0xbc,0x02,0x00,0x00,0x4d,
0x00,0x53,0x00,0x20,0x00,0x53,0x00,0x68,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x20,
0x00,0x44,0x00,0x6c,0x00,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0x00,0x02,0x50,0x06,0x00,0x04,0x00,0x9d,0x00,0x21,0x00,0xe8,
0x03,0x00,0x00,0xff,0xff,0x82,0x00,0x50,0x00,0x72,0x00,0x6f,0x00,0x6d,0x00,0x70,
0x00,0x74,0x00,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0x00,0x81,0x50,0x06,0x00,0x25,0x00,0xd8,0x00,0x0e,0x00,0xe9,
0x03,0x00,0x00,0xff,0xff,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x84,0x10,0xa1,0x50,0x06,0x00,0x37,0x00,0xd8,0x00,0x31,0x00,0xea,
0x03,0x00,0x00,0xff,0xff,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0x00,0x03,0x50,0xab,0x00,0x04,0x00,0x33,0x00,0x0e,0x00,0x01,
0x00,0x00,0x00,0xff,0xff,0x80,0x00,0x4f,0x00,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x50,0xab,0x00,0x15,0x00,0x33,
0x00,0x0e,0x00,0x02,0x00,0x00,0x00,0xff,0xff,0x80,0x00,0x43,0x00,0x41,0x00,0x4e,
0x00,0x43,0x00,0x45,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x00,0x00,0x27,0x00,0x08,0x00,0x08,0x00,0xff,
0xff,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0x00,0x00
}; static LPCTSTR definputbox_buttonnames[] = { _T("OK"), _T("CANCEL") };
static const INT_PTR definputbox_buttonids[] = { IDOK, IDCANCEL }; static const INT
definputbox_id_prompt = ,
definputbox_id_edit1 = ,
definputbox_id_edit2 = ; WIN32INPUTBOX_PARAM::WIN32INPUTBOX_PARAM()
{
bMultiline = false;
hwndOwner = ;
DlgTemplateName = ;
hInstance = (HINSTANCE) ::GetModuleHandle();
DlgTemplateData = definputbox_dlg; bCenter = true; dwStylesPlus = ;
dwExStylesPlus = ;
dwStylesMinus = 0xFFFFFFFF;
dwExStylesMinus = 0xFFFFFFFF; xPos = yPos = -; szResult = ;
nResultSize = ;
} CWin32InputBox::CWin32InputBox(WIN32INPUTBOX_PARAM *param)
{
_param = param;
} CWin32InputBox::~CWin32InputBox()
{ } void CWin32InputBox::SetParam(WIN32INPUTBOX_PARAM *param)
{
_param = param;
} WIN32INPUTBOX_PARAM *CWin32InputBox::GetParam()
{
return _param;
} INT_PTR CWin32InputBox::InputBoxEx(WIN32INPUTBOX_PARAM *param)
{
// Check mandatory parameters
if (param->szResult == )
{
::SetLastError(ERROR_INVALID_PARAMETER);
return ;
} LPDLGTEMPLATE dlgTemplate; if (param->DlgTemplateName != )
{
HMODULE hModule = (HMODULE)param->hInstance;
HRSRC rcDlg = ::FindResource(hModule, MAKEINTRESOURCE(param->DlgTemplateName), RT_DIALOG);
if (rcDlg == NULL)
return ; HGLOBAL hglobalDlg = ::LoadResource(hModule, rcDlg);
if (hglobalDlg == NULL)
return ; dlgTemplate = (LPDLGTEMPLATE) hglobalDlg;
}
else if (param->DlgTemplateData != )
{
dlgTemplate = (LPDLGTEMPLATE) param->DlgTemplateData;
} MSDN_DLGTEMPLATEEX *dlgTemplateEx =
IsDlgTemplateExtended((LPDLGTEMPLATE) dlgTemplate) ? (MSDN_DLGTEMPLATEEX *) dlgTemplate : ; if (dlgTemplateEx != )
{
dlgTemplateEx->exStyle |= param->dwExStylesPlus;
dlgTemplateEx->style |= param->dwStylesPlus;
dlgTemplateEx->exStyle &= param->dwExStylesMinus;
dlgTemplateEx->style &= param->dwStylesMinus; if (param->bCenter)
dlgTemplateEx->style |= DS_CENTER; if (param->xPos != -)
dlgTemplateEx->x = param->xPos;
if (param->yPos != -)
dlgTemplateEx->y = param->yPos;
}
else
{
dlgTemplate->dwExtendedStyle |= param->dwExStylesPlus;
dlgTemplate->style |= param->dwStylesPlus;
dlgTemplate->dwExtendedStyle &= param->dwExStylesMinus;
dlgTemplate->style &= param->dwStylesMinus; if (param->bCenter)
dlgTemplate->style |= DS_CENTER; if (param->xPos != -)
dlgTemplate->x = param->xPos; if (param->yPos != -)
dlgTemplate->y = param->yPos;
} CWin32InputBox inputbox(param); // Resize dialog and SHOW or HIDE multiline
INT_PTR r = ::DialogBoxIndirectParam(param->hInstance, dlgTemplate, param->hwndOwner, (DLGPROC)DlgProc, (LPARAM)&inputbox); return r;
} INT_PTR CWin32InputBox::InputBox(
LPCTSTR szTitle,
LPCTSTR szPrompt,
LPTSTR szResult,
DWORD nResultSize,
bool bMultiLine,
HWND hwndParent)
{
WIN32INPUTBOX_PARAM param; param.szTitle = szTitle;
param.szPrompt = szPrompt;
param.szResult = szResult;
param.nResultSize = nResultSize;
param.bMultiline = bMultiLine; return InputBoxEx(&param);
} void CWin32InputBox::InitDialog()
{
// Set the button captions
for (size_t i=;i<sizeof(definputbox_buttonids)/sizeof(definputbox_buttonids[]);i++)
::SetDlgItemText(_param->hDlg, (int) definputbox_buttonids[i], definputbox_buttonnames[i]); // Set other controls
::SetWindowText(_param->hDlg, _param->szTitle);
::SetDlgItemText(_param->hDlg, definputbox_id_prompt, _param->szPrompt); HWND hwndEdit1 = ::GetDlgItem(_param->hDlg, definputbox_id_edit1);
HWND hwndEdit2 = ::GetDlgItem(_param->hDlg, definputbox_id_edit2); if (_param->bMultiline)
_hwndEditCtrl = hwndEdit2;
else
_hwndEditCtrl = hwndEdit1; ::SetWindowText(_hwndEditCtrl, _param->szResult); RECT rectDlg, rectEdit1, rectEdit2; ::GetWindowRect(_param->hDlg, &rectDlg);
::GetWindowRect(hwndEdit1, &rectEdit1);
::GetWindowRect(hwndEdit2, &rectEdit2); if (_param->bMultiline)
{
::ShowWindow(hwndEdit1, SW_HIDE);
::SetWindowPos(
hwndEdit2,
HWND_NOTOPMOST,
rectEdit1.left - rectDlg.left,
(rectEdit1.top - rectDlg.top) - (rectEdit1.bottom - rectEdit1.top),
,
,
SWP_NOSIZE | SWP_NOZORDER); ::SetWindowPos(
_param->hDlg,
HWND_NOTOPMOST,
,
,
rectDlg.right - rectDlg.left,
rectDlg.bottom - rectDlg.top - (rectEdit1.bottom - rectEdit1.top),
SWP_NOMOVE); }
else
{
::SetWindowPos(
_param->hDlg,
HWND_NOTOPMOST,
,
,
rectDlg.right - rectDlg.left,
rectEdit1.bottom - rectDlg.top + ,
SWP_NOMOVE); ::ShowWindow(hwndEdit2, SW_HIDE);
}
} // Message handler for about box.
LRESULT CALLBACK CWin32InputBox::DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CWin32InputBox *_this = (CWin32InputBox *) ::GetWindowLong(hDlg, GWL_USERDATA);
WIN32INPUTBOX_PARAM *param = _this ? _this->GetParam() : ; switch (message)
{
case WM_INITDIALOG:
{
::SetWindowLong(hDlg, GWL_USERDATA, (LONG) lParam); _this = (CWin32InputBox *) lParam;
_this->_param->hDlg = hDlg;
_this->InitDialog();
return TRUE;
} case WM_COMMAND:
{
#ifdef _MY_DEBUG
CHAR buf[];
static int i=;
sprintf(buf, "WM_COMMAND: %09d wParam=%08X lParam=%08X\n", i++, wParam, lParam);
OutputDebugString(buf);
#endif
INT_PTR buttonId = LOWORD(wParam);
for (size_t i=;
i<sizeof(definputbox_buttonids)/sizeof(definputbox_buttonids[]);
i++)
{
if (buttonId == definputbox_buttonids[i])
{
::GetWindowText(
_this->_hwndEditCtrl,
_this->_param->szResult,
_this->_param->nResultSize); ::EndDialog(hDlg, buttonId);
return TRUE;
}
}
}
break;
}
return FALSE;
}

Win32InputBox,C接口的,实现类似VB的InputBox的功能的更多相关文章

  1. js 实现类似php函数number_format的功能

    今天同事在做一个功能的时候需要使用js来实现类似php函数number_format的功能,最后就有了下面的方法,可以实现了: /** * number_format * @param number ...

  2. SharePoint 2010 类似人人网站内信功能实施

    简介:用SharePoint代码加实施的方式,完成类似人人网站内信功能,当然,实现的比较简单,样式也比较难看,只为给大家一个实施的简单思路,如有谬误,还请见谅.当然,还有就是截图比较长,当然为了让大家 ...

  3. MVC实现类似QQ的网页聊天功能-ajax(下)

    此篇文章主要是对MVC实现类似QQ的网页聊天功能(上)的部分代码的解释. 首先说一下显示框的滚动条置底的问题: 结构很简单一个大的div(高度一定.overflow:auto)包含着两个小的div第一 ...

  4. springmvc+ztree v3实现类似表单回显功能

    在做权限管理系统时,可能会用到插件zTree v3,这是一个功能丰富强大的前端插件,应用很广泛,如异步加载菜单制作.下拉选择.权限分配等.在集成SpringMVC中,我分别实现了zTree的添删改查, ...

  5. 大数据学习day15----第三阶段----scala03--------1.函数(“_”的使用, 函数和方法的区别)2. 数组和集合常用的方法(迭代器,并行集合) 3. 深度理解函数 4 练习(用java实现类似Scala函数式编程的功能(不能使用Lambda表达式))

    1. 函数 函数就是一个非常灵活的运算逻辑,可以灵活的将函数传入方法中,前提是方法中接收的是类型一致的函数类型 函数式编程的好处:想要做什么就调用相应的方法(fliter.map.groupBy.so ...

  6. VS "15" 预览 5 中 VB 15 新增的功能

    VS "15" 预览 5 给 VB 带来了更新.这次的更新内容有3个: * 值元组 ValueTuple这个功能能把一组计算结果成组返回.为了使用这个功能,我们要安装 System ...

  7. 【VB技巧】VB ListView 控件功能使用详解

    来源:http://lcx.cc/?i=494 ListView控件 在工具箱上击鼠标右键,选择快捷菜单的Components(部件)项,在控件列表中选择Microsoft Windows Commo ...

  8. Python 清理HTML标签类似PHP的strip_tags函数功能(二)

    没有发现Python 有现成的类似功能模块,所以昨天写了个简单的 strip_tags 但还有些问题,今天应用到采集上时进行了部分功能的完善, 1. 对自闭和标签处理 2. 以及对标签参数的过滤 fr ...

  9. JMeter实现登录初始化(类似LR的init函数功能实现)

    1.项目背景 在做项目的性能测试过程中,发现系统的登录功能非常慢,所以,在涉及到登录才能操作的场景,尽量避开登录操作 解决方案: 首选设置“登录并生成签名值”线程组

随机推荐

  1. oracle数据库ID自增长--序列

    什么是序列?在mysql中有一个主键自动增长的id,例如:uid number primary key auto_increment;在oracle中序列就是类似于主键自动增长,两者功能是一样的,只是 ...

  2. Tomcat报java.io.IOException: Broken pipe错误

    Tomcat报java.io.IOException: Broken pipe错误,如下图: 解决方案:我的原因是因为网络策略导致出现该问题,即网络端口未启用或被限制.

  3. ie10兼容问题 -- 将div定位absolute在图片img上面,导致div点击事件无效

    ie10兼容问题: 将div定位absolute在图片img上面,发现div若不加背景色,导致div点击事件(任何事件)无效. <div class="paper-box"& ...

  4. bzoj4326: NOIP2015 运输计划(二分+LCA+树上差分)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4326 题目大意:有一颗含有n个顶点的树,每两个点之间有一个边权,现在有m个运输计划,每个 ...

  5. java Byte源码分析

    源码: public static int toUnsignedInt(byte x) { return ((int) x) & 0xff; } 原理: -128(byte) 原码:10000 ...

  6. php 获取真实ip

    REMOTE_ADDR:是和服务器直接"握手"的IP. HTTP_CLIENT_IP:代理服务器添加的 HTTP 头,存放客户端真实IP. HTTP_X_FORWARDED_FOR ...

  7. nginx图片过滤处理模块http_image_filter_module

    nginx图片过滤处理模块http_image_filter_module安装配置笔记 http_image_filter_module是nginx提供的集成图片处理模块,支持nginx-0.7.54 ...

  8. 使用VisualStudio 开发Arduino

    Arduino IDE界面简洁,整体功能还算完善,相比其他编译器明显的不足就是不能进行硬件调试,再就是没有代码提示功能,文件关系不清晰.头文件打开不方便. VisualStudio作为时下最为流行的W ...

  9. 【hackerrank】Weather Observation Station 18

    题目如下: Consider  and  to be two points on a 2D plane. happens to equal the minimum value in Northern ...

  10. Vuex-全局状态管理【简单小案例】

    前言: Vuex个人见解: 1.state :所有组件共享.共用的数据.理解为不是一个全局变量,不能直接访问以及操作它.2.mutations : 如何操作 state 呢?需要有一个能操作state ...