窗口界面而不是c中的控制台

时间:2010-03-17 09:14:12

标签: c++ c windows

我在c中有控制台应用程序。我想转换成窗口应用程序,请指导我,以便我能够实现。

2 个答案:

答案 0 :(得分:3)

这是一个需要单独讨论的大话题。您可能想学习一些GUI工具包。 Qt或wxWidgets会做(尽管它们是用C ++编写的,而不是C语言编写的)。如果你正在进行C跨平台开发,你可以看看GTK +。如果您只打算为Windows编写程序,则可以学习Windows API。无论你选择哪种方式,都有很多可用的文档,但每种方式都需要大量的学习,这里无法解释。

答案 1 :(得分:2)

您需要采取的步骤概述:

  • 用WinMain替换main
  • 将子系统从控制台更改为窗口
  • 创建一个主窗口或一个对话框(资源编辑器可能会派上用场),以及相应的程序
  • 创建一个消息循环
    • 更改要在循环中执行的程序结构(程序应始终负责)
    • 或在一个单独的线程中执行“串行控制台”程序,只需将其输出发送到“窗口”

前两个很容易,最多的工作在于接下来的步骤。如果您希望窗口只是您自己的控制台复制,您可以设计包含一个文本或编辑控件的对话框,并实现一个简单的对话框过程和一个消息循环。下面是一些代码片段,但是提供完整且有效的样本将超出合理的空间。如果你理解下面的代码,我想它应该让你开始。如果没有,恐怕你必须先学习Windows编程基础知识。

对话程序

HWND consoleEditHWnd;

static int CALLBACK ConsoleDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
  switch (message)
  {
    case WM_INITDIALOG:
    {
      InitWindow((HINSTANCE)hInstApp,hDlg);
      consoleEditHWnd = GetDlgItem(hDlg,IDC_CONSOLE_EDIT);
      return TRUE;
    }


    case WM_SIZE:
      if (consoleEditHWnd)
      {
        RECT rect;
        GetClientRect(hDlg, &rect);
        MoveWindow(
          consoleEditHWnd, rect.left, rect.top,
          rect.right - rect.left, rect.bottom - rect.top, TRUE
        );
      }
      break;
  }
  return FALSE;
}

对话框创建和消息循环

    hwndApp = CreateDialog(hInst, MAKEINTRESOURCE(IDD_CONSOLE), NULL, ConsoleDlgProc);
    ShowWindow((HWND)hwndApp,SW_SHOW);
    UpdateWindow((HWND)hwndApp);

    MSG msg;
    while( PeekMessage(&msg, 0, 0, 0, PM_REMOVE) )
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }

写入控制台

如果要在“控制台”中添加一些文本,可以使用

进行操作
  int count = GetWindowTextLengthW(consoleEditHWnd);
  ... allocate a buffer
  GetWindowTextW(consoleEditHWnd,buffer,count+newTextSize);
  ... append
  SetWindowTextW(consoleEditHWnd,buffer);