C++ 通过单击按钮c+运行事件+;

C++ 通过单击按钮c+运行事件+;,c++,winapi,events,button,click,C++,Winapi,Events,Button,Click,我试图通过单击按钮来运行简单事件,但我的代码似乎不起作用。有两个问题。首先,我需要在单击按钮时运行intnmr()。其次,我需要在string infle()中插入OpenFileDialog选择的文件路径。这是我的代码: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HWND hWndButton switch (message) { case

我试图通过单击按钮来运行简单事件,但我的代码似乎不起作用。有两个问题。首先,我需要在单击按钮时运行
intnmr()
。其次,我需要在
string infle()
中插入OpenFileDialog选择的文件路径。这是我的代码:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HWND hWndButton

    switch (message)
    {
    case WM_CREATE:
        CreateMenubar(hWnd);

        hWndButton = CreateWindow("button", "Go!",WS_VISIBLE|WS_CHILD,15,45,60,25,hWnd,
            (HMENU) ID_BUTTON,NULL,NULL);

        break;

    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDM_FILE_OPEN:
            openFileDialog1;
            if (openFileDialog1->ShowDialog())
            {
                MessageBox(0, openFileDialog1->FileName, _T("File name"),
                    MB_OK | MB_ICONINFORMATION);
            }
            openFileDialog1->FilterIndex = 1;
            openFileDialog1->Flags |= OFN_SHOWHELP;
            openFileDialog1->InitialDir = _T("C:\\Windows\\");
            openFileDialog1->Title = _T("Open Text File");

            break;

        case ID_BUTTON:

            int nmr();

            break;

        case IDM_FILE_QUIT:
            SendMessage(hWnd, WM_CLOSE, 0, 0);
            break;
        }
        break;

    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
        break;
        }

return DefWindowProc(hWnd, message, wParam, lParam);
}

void CreateMenubar(HWND hwnd)
{
HMENU hMenubar;
HMENU hMenu;

hMenubar = CreateMenu();
hMenu = CreateMenu();

AppendMenuW(hMenu, MF_STRING, IDM_FILE_OPEN, L"&Open");
AppendMenuW(hMenu, MF_SEPARATOR, 0, NULL);
AppendMenuW(hMenu, MF_STRING, IDM_FILE_QUIT, L"&Quit");

AppendMenuW(hMenubar, MF_POPUP, (UINT_PTR)hMenu, L"&File");
    SetMenu(hwnd, hMenubar);
}



OpenFileDialog::OpenFileDialog(void)
    {
        this->DefaultExtension = 0;
        this->FileName = new TCHAR[MAX_PATH];
        this->Filter = 0;
        this->FilterIndex = 0;
        this->Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
        this->InitialDir = 0;
        this->Owner = 0;
        this->Title = 0;
    }

    bool OpenFileDialog::ShowDialog()
    {
        OPENFILENAME ofn;

    ZeroMemory(&ofn, sizeof(ofn));

    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = this->Owner;
    ofn.lpstrDefExt = this->DefaultExtension;
    ofn.lpstrFile = this->FileName;
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = MAX_PATH;
    ofn.lpstrFilter = this->Filter;
    ofn.nFilterIndex = this->FilterIndex;
    ofn.lpstrInitialDir = this->InitialDir;
    ofn.lpstrTitle = this->Title;
    ofn.Flags = this->Flags;

    GetOpenFileName(&ofn);

    if (_tcslen(this->FileName) == 0) return false;


    return true;
}


int nmr()
{
    string inFile(openFileDialog1->FileName);
    string outFile("C:\\Users\\admin\\Desktop\\outT1.txt");

    int numline = 0;
    double v1;
    string s;
    string v2, v3, v4;
    string line_keep, line_avoid;
    ifstream in_stream;
    ofstream out_stream;
    in_stream.open(inFile.c_str());
    out_stream.open(outFile.c_str());
    if (in_stream.fail() || out_stream.fail())
    {
        cout << "Error ocured during oppening file!" << endl;
        return 1;
    }
LRESULT回调WndProc(HWND HWND,UINT消息,WPARAM WPARAM,LPARAM LPARAM)
{
HWND HWND按钮
开关(信息)
{
案例WM_创建:
创建菜单栏(hWnd);
hWndButton=CreateWindow(“按钮”,“开始!”),WS_可见| WS_子对象,15,45,60,25,hWnd,
(U)ID_按钮,空,空);
打破
case WM_命令:
开关(LOWORD(wParam))
{
案例IDM\u文件\u打开:
openFileDialog1;
如果(openFileDialog1->ShowDialog())
{
MessageBox(0,openFileDialog1->文件名(“文件名”),
MB|u OK | MB|u ICONINFORMATION);
}
openFileDialog1->FilterIndex=1;
openFileDialog1->Flags |=OFN_SHOWHELP;
openFileDialog1->InitialDir=\u T(“C:\\Windows\\”;
openFileDialog1->Title=\u T(“打开文本文件”);
打破
案例ID_按钮:
int nmr();
打破
案例IDM\u文件\u退出:
发送消息(hWnd,WM_CLOSE,0,0);
打破
}
打破
案例WM_销毁:
{
PostQuitMessage(0);
返回0;
}
打破
}
返回DefWindowProc(hWnd、message、wParam、lParam);
}
无效创建菜单栏(HWND HWND)
{
花木;
华浓华浓;
hMenubar=CreateMenu();
humenu=CreateMenu();
AppendMenuW(hMenu,MF_字符串,IDM_文件打开,L“&OPEN”);
AppendMenuW(hMenu,MF_分隔符,0,NULL);
AppendMenuW(humenu,MF_字符串,IDM_文件_QUIT,L“&QUIT”);
附录菜单(菜单栏、菜单栏、弹出菜单、菜单栏和文件);
设置菜单(hwnd、hMenubar);
}
OpenFileDialog::OpenFileDialog(无效)
{
此->DefaultExtension=0;
此->文件名=新的TCHAR[最大路径];
这个->过滤器=0;
此->过滤器索引=0;
这->标志=OFN_路径必须存在| OFN_文件必须存在;
这->InitialDir=0;
此->所有者=0;
此->标题=0;
}
bool OpenFileDialog::ShowDialog()
{
OpenN;
零内存(&ofn,sizeof(ofn));
ofn.L结构尺寸=尺寸ofn;
ofn.hwndOwner=此->所有者;
ofn.lpstrDefExt=此->默认扩展名;
ofn.lpstrFile=此->文件名;
ofn.lpstrFile[0]='\0';
ofn.nMaxFile=最大路径;
ofn.lpstrFilter=此->过滤器;
ofn.nFilterIndex=此->过滤器索引;
ofn.lpstrInitialDir=此->初始目录;
ofn.lpstrtite=此->标题;
ofn.Flags=此->标志;
GetOpenFileName(&ofn);
if(_tcslen(this->FileName)==0)返回false;
返回true;
}
int nmr()
{
字符串填充(openFileDialog1->FileName);
字符串输出文件(“C:\\Users\\admin\\Desktop\\outT1.txt”);
int numline=0;
双v1;
字符串s;
字符串v2、v3、v4;
线保持,线避免;
ifstream in_stream;
流出的水;
in_stream.open(infle.c_str());
out_stream.open(outFile.c_str());
if(in_stream.fail()| out_stream.fail())
{
库特
这声明了一个名为
nmr
的函数。这不是您想要的。您想要调用与您在别处定义的同名函数。您的意思是编写:

int retval = nmr();
这将调用函数

如果您不关心返回值,只需执行以下操作:

nmr();
您需要在调用上方定义函数
nmr
,或者使用转发声明

将文件名作为参数传递给
nmr()
会更有意义

int nmr(const string& inFileName)

使用<代码> int <代码>返回值来表示C++中的成语是远远不够的。如果必须使用返回值来表示成功,那么<>代码>布尔-< /C> >更合适。C的旧变体没有布尔类型,这可能是您学习返回<代码> int <代码>以表示成功的概念。但它不是T。在编写新代码时,您需要忘记这个概念。在与现有代码交互时,您仍然需要理解它。

代码的格式非常糟糕。而且
int nmr();
必须是
nmr();
你的编辑完全改变了这个问题。我把它回滚了。@Vinzenz我想有什么东西正在吞噬他函数体中最左边的四个空格;至少看起来是这样like@Angew谢谢。更正。我已经做了一个转发声明
intnmr(conststring&inFileName)
,编辑了
LRESULT
intnmr(const string&inFileName)
。它仍然不起作用。我只需要选择文件并通过ckicking按钮编辑它,使用
int nmr()
函数。我想我已经回答了您提出的问题。我无法调试看不到的新代码。
int nmr(const string& inFileName)