将表单添加到控制台应用程序. [英] Adding forms to a console application.
问题描述
我有一个图形控制台应用程序,如果我可以更改表单中的各种值,然后单击表单上的开始"按钮,然后执行控制台应用程序,那就更好了.
假设我有一个像这样的简单c ++程序(可以在turbo c ++中执行)
I have a graphics console application which could be better if I could change various values in it in a form, then execute the console application after clicking a "start" button on the form.
Suppose I have a simple c++ program like this (which could execute in turbo c++)
//addition.cpp
#include<iostream.h>
int x=10;
int y=100;
int main()
{
int sum;
sum=x+y;
cout << "\n The sum of x and y is " << sum;
return 0;
}</iostream.h>
如您所知,如果我编译并运行该程序,它将打开一个控制台窗口,该窗口显示文本"x和y的和为110"并退出.
我现在想要的是拥有一个首先打开的Windows窗体. Windows窗体包含:
-2文本框.一个接受值"x",另一个接受"y".
-一个提交"按钮.
当我单击提交"按钮时,additional.cpp的全局变量的值(int x和y)应更改为我在文本框中编写的内容,以便控制台相应地显示结果.
现在,我不想改变该程序的工作方式(例如某位出色的家伙建议我将结果发布在警报消息中),就像我已经告诉您的那样,这是为基于图形的程序创建前端我已经建好了.
简而言之,该程序包括一个重力作用在其上的弹跳球.我希望用户能够从前端形式更改各种参数,例如球的初始位置,重力常数,弹性等.
无论如何,如果能获得指导或逐步入门来运行此简单加法程序,我将不胜感激.
PS:-我有一些Visual C ++ 2010 Express Edition的使用知识,尽管详细的演练不会对您造成伤害.
-我是本科生,并且对工作场所使用的各种技术术语没有任何经验.到目前为止,我在繁忙的学术计划中学习了VC ++,没有薪水,这是我认为非常不错的成就.
-我将Allegro库用于图形.再一次,从头开始学习这一内容.
最好的问候,
Divy
As you know, if I compile and run this program, it should open a console window which displays the text "The sum of x and y is 110" and quits.
What I want now, is to have a windows form that opens first. The windows form contains:
-2 text boxes. One accepts the value "x" and the other accepts "y".
-A "submit" button.
When I click the "submit" button, the global variables'' (int x and y) values in addition.cpp should have changed to whatever I have written in the text boxes so that the console displays the result accordingly.
Now, I don''t want to change the way this program works (like some brilliant bloke suggesting me to post the result in an alert message instead) as I already told you, this is for creating front-end for a graphics based program I already built.
In brief, this program consists of a bouncing ball with gravity acting on it. I want the user to be able to change various parameters like initial position of the ball, gravitational constant, elasticity etc from a front-end form.
Anyway for now, I would appreciate it if I could get a guide or a walkthrough to get this simple addition program running.
PS: -I have some working knowledge of Visual C++ 2010 express edition although a detailed walkthrough couldn''t hurt.
-I am an undergrad student, and I have no prior experience with all sorts of technical jargon used at the workplace. Having learnt VC++ so far amidst my busy academic schedule and no pay is something I would consider, a pretty great achievement.
-I used Allegro libraries for the graphics. Again, learned this one from scratch.
Best regards,
Divy
推荐答案
我认为在这种情况下,您应该创建Windows应用程序.然后,该应用程序将创建另一个应用程序(现有应用程序)并退出.
可以使用CreateProcess.
http://msdn.microsoft.com/en-us/library/ms682425 (v = vs.85).aspx [
I think that in this case, you should create a Windows application. That application would then create another application (the existing application) and exit.
CreateProcess might be used.
http://msdn.microsoft.com/en-us/library/ms682425(v=vs.85).aspx[^]
创建新Window应用程序的更好方法.然后将旧的控制台基本代码移植到Window Base Application:)
Better way to create new Window Application. And port your old console base code to Window Base Application :)
好吧,我很无聊,外面一片漆黑,所以我不能再飞3或太阳升起时的4个小时.我将为您提供各种指导,我将如何做.
我刚刚按照上一篇文章中的建议研究了控制台功能(窗口).我发现在使用gui应用程序中的控制台窗口之前,似乎只需要使用其中两个功能即可.但是-为了使printf或cout输出出现在此控制台中,还有更多工作要做-如MSDN页面底部针对AllocConsole所述.遵循该建议,并阅读页面底部有关AttachConsole的评论,我们将转到页面 [ ^ ]详细介绍了如何连接这些(和其他)功能添加到新创建的控制台窗口.
要测试所需的功能,我
1)创建了Windows32 GUI应用程序.
2)添加了3个按钮-2个虚拟变量和1个按钮来创建控制台窗口
3)连接第三个按钮以调用此功能:
Okay then, I''m bored and it''s dark outside so I can''t go flying for another 3 or 4 hours when the sun comes up. I''ll see what I can do about giving you a walk-through of sorts.
I''ve just looked into the Console Functions (windows) as suggested in my last post. I have found that it appears that I only need to use 2 of the functions before I can use a console window from a gui app. HOWEVER - in order to get printf or cout output to appear in this console, there is a little more work to do - as mentioned at the bottom of the MSDN page for AllocConsole. Following the suggestion, and reading the comment at the bottom of the page for AttachConsole we are directed to a page [^] that details how to connect these (and other) functions to the newly created console window.
To test the requested functionality, I
1) Created a windows32 gui app.
2) Added 3 buttons - 2 dummies and 1 to create a console window
3) Wired the 3rd button up to call this function:
void handleConsoleButton()
{
MessageBox(NULL,"Creating the console","msg - handleConsoleButton", MB_OK);
FreeConsole();
RedirectIOToConsole();
printf("Hello, World!\n");
}
当然,这是在主窗口的功能中执行的,如下所示:
This is of course, carried out in the main window''s function as shown here:
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
case WM_COMMAND:
switch LOWORD(wParam)
{
case IDC_BTN1:
MessageBox(NULL,"text1","msg", MB_OK);
break;
case IDC_BTN2:
MessageBox(NULL,"text2","msg", MB_OK);
break;
case IDC_BTN3:
handleConsoleButton();
break;
}
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
函数RedirectIOToconsole来自我链接到的页面,并由此定义:
The function RedirectIOToconsole comes from the page I linked to and is defined thusly:
#define MAX_CONSOLE_LINES 500
void RedirectIOToConsole()
{
int hConHandle;
long lStdHandle;
CONSOLE_SCREEN_BUFFER_INFO coninfo;
FILE *fp;
// allocate a console for this app
AllocConsole();
// set the screen buffer to be big enough to let us scroll text
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),
&coninfo);
coninfo.dwSize.Y = MAX_CONSOLE_LINES;
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),
coninfo.dwSize);
// redirect unbuffered STDOUT to the console
lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen( hConHandle, "w" );
*stdout = *fp;
setvbuf( stdout, NULL, _IONBF, 0 );
// redirect unbuffered STDIN to the console
lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen( hConHandle, "r" );
*stdin = *fp;
setvbuf( stdin, NULL, _IONBF, 0 );
// redirect unbuffered STDERR to the console
lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen( hConHandle, "w" );
*stderr = *fp;
setvbuf( stderr, NULL, _IONBF, 0 );
// make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog
// point to console as well
ios::sync_with_stdio();
}
当然,您的里程可能会有所不同.尽管我最感谢您为我提供了推动力,但最终(一点点)学习了有关控制台功能的知识.干杯!
Naturally, your mileage may vary. Though I mujst say thanks for providing the impetus to me finally learning (a little, little bit) about the Console Functions. Cheers!
这篇关于将表单添加到控制台应用程序.的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!