首页
社区
课程
招聘
[讨论]VC有InputBox函数吗?
发表于: 2007-9-19 12:37 14503

[讨论]VC有InputBox函数吗?

2007-9-19 12:37
14503
我每次都是自已写一个类似的函数,以接受用户的输入消息,

这样虽然可行,也很简单,但觉得麻烦

不知VC是否有类似VB的InputBox函数?......

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
2
当要求用户输入数据时, 不知兄弟们在VC中是如何处理的,说一下嘛,

难道确实要自已新建一个对话框,再放一个编辑框和两个按钮吗?

这样做,太不爽了!
2007-9-21 17:11
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
3
是只有这样做。VB的InputBox也是创建一个对话框再放编辑框和两个按钮的。
2007-9-21 18:47
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
4
VB 的 InputBox是VB自带的

VC为什么就不像MessageBox()函数一样,再自带一个InputBox()函数呢?

。。。无奈
2007-9-21 21:16
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
5
自己写一个InputBox库函数保存起来也可以啊,以后只需添加头文件,直接调用自己写的InputBox就行了。
2007-9-21 21:33
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
6
那这个InputBox函数代码,包括对话框的资源数据是以什么形式引入到工程中来的?

如果是DLL,觉得还是不方便。

VC编译后,能否将InputBox()的所有代码和数据直接嵌入到最终的exe文件当中,请老大指点一下,谢谢!
2007-9-21 23:54
0
雪    币: 148
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你说的很好但是我自己想了想,我还是搞不定呀
2007-9-24 21:00
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
8
这种方式用DLL来实现是比较简单的,在静态链接库中好像没有办法可以直接处理对话框资源数据。

若真要通过静态链接库来实现的话,我想,通过在内存中动态创建对话框是应该可以实现的,编程相对复杂一点,我还没搞定。。。
2007-9-24 22:00
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
9
/*  注意,InputBox函数是C++语法,只能用于C++,不能用于C */

/********************************************/
/*       InputBox.h                         */
/********************************************/
BOOL _InitInputBox(HWND hParent);          // 可选,不过在调用InputBox函数之前最好调用一下该函数,
                                           // 该函数是初始化InputBox,主要就是传入一个父窗口句柄。
void _SetNumber(BOOL fIsNumber);           // 可选,该函数是设置Edit只能输入数字
void _SetLowerCase(BOOL fIsLowerCase);     // 可选,该函数是设置Edit只能输入小写字母
void _SetUpperCase(BOOL fIsUpperCase);     // 可选,该函数是设置Edit只能输入大写字母
void _SetMaxLine(unsigned int nLineSize);  // 可选,该函数是设置Edit可以输入最大字符数,默认最大是256个字符,不能超过这个数。

/*********************************************************/
/*                InputBox函数                           */
/*  lpWndMsg     ; 必选参数,用于提示用户                 */
/*  lpWndTitle   ; 可选参数, 设置对话框默认标题           */
/*  lpDefValue   ; 可选参数,设置Edit默认值               */
/*  xPos         ; 可选参数,如果为零则居中窗口            */
/*  yPos         ; 可选参数,如果为零则居中窗口            */
/*  lpHelpFile   ; 可选参数,打开*.hlp帮助文件             */
/*  nHelpIndex   ; 可选参数,但如果设置了lpHelpFile参数,  */
/*               ; 这个参数就是Help文件的索引              */
/*  如果函数成功,返回一个char *指针,包含用户输入的内容     */
/*********************************************************/
char *_InputBox(char *lpWndMsg,
                char *lpWndTitle = "工程!",
                char *lpDefValue = "",
                int xPos = 0,
                int yPos = 0,
                char *lpHelpFile = "",
                int nHelpIndex = 0);

#define InputBox     _InputBox
#define SetNumber    _SetNumber
#define InitInputBox _InitInputBox
#define SetLowerCase _SetLowerCase
#define SetUpperCase _SetUpperCase
#define SetMaxLine   _SetMaxLine

/******************************************************/
/*              InputBox.cpp                          */
/******************************************************/
#include <windows.h>

int WINAPI WndProc(HWND hWnd,
                                   UINT uMsg,
                                   WPARAM wParam,
                                   LPARAM lParam);
BOOL _InitVar();
HWND _CreateWindow(HINSTANCE hInst);
int _Run(HWND hWnd);

HINSTANCE _hInstance;
char *_lpWndMsg;
char *_lpWndTitle;
char *_lpDefValue;
int _xPos;
int _yPos;
char *_lpHelpFile;
int _nHelpIndex;
HWND _hParent;
HWND _hDesktop;
HWND _hEdit, _hBtnOk, _hBtnCancel, _hBtnHelp;
HWND _hMsgText;
RECT _st_rcDesktop;
RECT _st_rcWnd;
HFONT _hWndFont;
char _szBuffer[256];
char *_lpWndFontName = "宋体";
UINT _nMaxLine = 255;
UINT _nEditStyle = WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_AUTOVSCROLL;

BOOL _InitInputBox(HWND hParent)
{
        if (!hParent)
                return FALSE;
        _hParent = hParent;
        if (!_hInstance)
                return _InitVar();
        return TRUE;
}

BOOL _InitVar()
{
        _hInstance = ::GetModuleHandle(NULL);
        _hDesktop = ::GetDesktopWindow();
        ::GetWindowRect(_hDesktop,&_st_rcDesktop);
        if (!_xPos)
                _xPos = (_st_rcDesktop.right - 365) / 2;
        if (!_yPos)
                _yPos = (_st_rcDesktop.bottom - 130) / 2;
        return TRUE;
}

int WINAPI WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
        HDC hWndDc;
        WORD uBtnID;
        switch(uMsg)
        {
        case WM_DESTROY:
                if (_hWndFont)
                        ::DeleteObject(_hWndFont);
                ::PostQuitMessage(0);
                break;
        case WM_CREATE:
                _hMsgText = ::CreateWindowEx(0,
                                                                        "Static",
                                                                        _lpWndMsg,
                                                                        WS_CHILD | WS_VISIBLE,
                                                                        5,
                                                                        5,
                                                                        275,
                                                                        70,
                                                                        hWnd,
                                                                        (HMENU)1000,
                                                                        _hInstance,
                                                                        0);
                _hBtnOk = ::CreateWindowEx(0,
                                                                        "Button",
                                                                        "确定(&K)",
                                                                        WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
                                                                        285,
                                                                        5,
                                                                        65,
                                                                        20,
                                                                        hWnd,
                                                                        (HMENU)IDOK,
                                                                        _hInstance,
                                                                        0);
                _hBtnCancel = ::CreateWindowEx(0,
                                                                                "Button",
                                                                                "取消(&C)",
                                                                                WS_CHILD | WS_VISIBLE,
                                                                                285,
                                                                                30,
                                                                                65,
                                                                                20,
                                                                                hWnd,
                                                                                (HMENU)IDCANCEL,
                                                                                _hInstance,
                                                                                0);
                _hBtnHelp = ::CreateWindowEx(0,
                                                                         "Button",
                                                                         "帮助(&H)",
                                                                         WS_CHILD | WS_VISIBLE,
                                                                         285,
                                                                         55,
                                                                         65,
                                                                         20,
                                                                         hWnd,
                                                                         (HMENU)IDHELP,
                                                                         _hInstance,
                                                                         0);
                _hEdit = ::CreateWindowEx(WS_EX_CLIENTEDGE,
                                                              "Edit",
                                                              _lpDefValue,
                                                              _nEditStyle,
                                                              5,
                                                              80,
                                                              350,
                                                              20,
                                                              hWnd,
                                                              (HMENU)2000,
                                                              _hInstance,
                                                              0);
                ::SendMessage(_hEdit,EM_SETLIMITTEXT,_nMaxLine,0);
                _hWndFont = ::CreateFont(12,
                                                                 6,
                                                                 0,
                                                                 0,
                                                                 12,
                                                                 0,
                                                                 0,
                                                                 0,
                                                                 GB2312_CHARSET,
                                                                 OUT_DEFAULT_PRECIS,
                                                                 CLIP_DEFAULT_PRECIS,
                                                                 DEFAULT_QUALITY,
                                                                 DEFAULT_PITCH,
                                                                 _lpWndFontName);
                if (!::lstrlen(_lpHelpFile))
                        ShowWindow(_hBtnHelp,SW_HIDE);
                hWndDc = ::GetDC(hWnd);
                ::SelectObject(hWndDc,_hWndFont);
                ::ReleaseDC(hWnd,hWndDc);
                ::SendDlgItemMessage(hWnd,1000,WM_SETFONT,(WPARAM)_hWndFont,0);
                ::SendDlgItemMessage(hWnd,2000,WM_SETFONT,(WPARAM)_hWndFont,0);
                ::SendDlgItemMessage(hWnd,IDOK,WM_SETFONT,(WPARAM)_hWndFont,0);
                ::SendDlgItemMessage(hWnd,IDCANCEL,WM_SETFONT,(WPARAM)_hWndFont,0);
                ::SendDlgItemMessage(hWnd,IDHELP,WM_SETFONT,(WPARAM)_hWndFont,0);
                break;
        case WM_KEYDOWN:
                if (wParam == VK_RETURN)
                        ::SendMessage(hWnd,WM_COMMAND,IDOK,0);
                break;
        case WM_SETFOCUS:
                ::SetFocus(_hEdit);
                break;
        case WM_COMMAND:
                uBtnID = LOWORD(wParam);
                switch(uBtnID)
                {
                case IDOK:
                        ::GetDlgItemText(hWnd,2000,_szBuffer,256);
                        ::DestroyWindow(hWnd);
                        break;
                case IDCANCEL:
                        ::DestroyWindow(hWnd);
                        break;
                case IDHELP:
                        ::WinHelp(hWnd,_lpHelpFile,HELP_INDEX,_nHelpIndex);
                        break;
                };
                break;
        default:
                return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
        }
        return (TRUE);
}

HWND _CreateWindow(HINSTANCE hInst)
{
        WNDCLASSEX st_WndClass;
        HWND hWnd;
        ::RtlZeroMemory(&st_WndClass,sizeof(st_WndClass));
        st_WndClass.cbSize        = sizeof(st_WndClass);
        st_WndClass.hInstance     = hInst;
        st_WndClass.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;
        st_WndClass.hCursor       = LoadCursor(0, IDC_ARROW);
        st_WndClass.hIcon         = LoadIcon(0, IDI_APPLICATION);
        st_WndClass.hIconSm       = st_WndClass.hIcon;
        st_WndClass.lpfnWndProc   = (WNDPROC)&WndProc;
        st_WndClass.lpszClassName = "InputBox_Class";
        st_WndClass.style         = CS_HREDRAW | CS_VREDRAW;
        ::RegisterClassEx(&st_WndClass);
        hWnd = ::CreateWindowEx(0,
                                                    "InputBox_Class",
                                                    _lpWndTitle,
                                                    WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE,
                                                    _xPos,
                                                    _yPos,
                                                    365,
                                                    130,
                                                    _hParent,
                                                    0,
                                                    hInst,
                                                    0);
        return hWnd;
}

int _Run(HWND hWnd)
{
        MSG st_Msg;
        if (!hWnd)
                return 0;
        ::ShowWindow(hWnd,SW_SHOW);
        ::UpdateWindow(hWnd);
        while(::GetMessage(&st_Msg,0,0,0))
        {
                if (st_Msg.message == WM_KEYDOWN)
                {
                        if (st_Msg.wParam == VK_RETURN)
                                ::SendMessage(hWnd,st_Msg.message,st_Msg.wParam,st_Msg.wParam);
                }
                ::TranslateMessage (&st_Msg) ;
                ::DispatchMessage (&st_Msg) ;
        }
        return st_Msg.wParam;
}

char *_InputBox(char *lpWndMsg,
                                char *lpWndTitle,
                                char *lpDefValue,
                                int xPos,
                                int yPos,
                                char *lpHelpFile,
                                int nHelpIndex)
{
        _lpWndMsg = lpWndMsg;
        _lpWndTitle = lpWndTitle;
        _lpDefValue = lpDefValue;
        _xPos = xPos;
        _yPos = yPos;
        _lpHelpFile = lpHelpFile;
        _nHelpIndex = nHelpIndex;
        if (!_hInstance)
                _InitVar();
        _Run(_CreateWindow(_hInstance));
        return _szBuffer;
}

void _SetNumber(BOOL fIsNumber)
{
        if (fIsNumber)
                _nEditStyle |= ES_NUMBER;
}
void _SetLowerCase(BOOL fIsLowerCase)
{
        if (fIsLowerCase)
                _nEditStyle |= ES_LOWERCASE;
}
void _SetUpperCase(BOOL fIsUpperCase)
{
        if (fIsUpperCase)
                _nEditStyle |= ES_UPPERCASE;
}
void _SetMaxLine(unsigned int nLineSize)
{
        if (nLineSize)
                if (nLineSize < _nMaxLine)
                        _nMaxLine = nLineSize;
}
2007-9-24 22:47
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
10
附件:
上传的附件:
2007-9-24 22:50
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
11
老大真是太无私伟大了!

谢谢老大的源码!
2007-9-25 07:20
0
雪    币: 179
活跃值: (131)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
12
谢谢小虾,收藏一份
2007-9-27 12:56
0
游客
登录 | 注册 方可回帖
返回