【问题标题】:API-level Unicode GUI Native apps in C++ for Windows/Linux/Mac适用于 Windows/Linux/Mac 的 C++ 中的 API 级 Unicode GUI 本机应用程序
【发布时间】:2010-10-20 02:27:33
【问题描述】:

适用于 Windows / Linux / Mac OS X 的 C++ 中的 API 级 Unicode GUI 本机应用程序。

我正在寻找编写一个简单的 UnicodeGUINative 应用程序,无需任何非标准库即可运行,用 GNU-GCC (g++) 编译的 C++ 编写。

不是

我不是指一个代码源在任何地方运行,而是 3 个(Win/Linux/Mac)代码源!无库运行(本机应用程序)。

  • 原生应用

    应用程序无需任何非标准库即可运行,只需要操作系统 C++ 运行时(如 Windows 上的 MSVCRT)。

  • Unicode 应用程序

    从右到左的窗口布局(支持从右到左的阅读语言),有两个按钮 [Message] 在消息框中显示 UTF-8 字符串(“اهلا بالعالم”),以及 [Exit] 到。 ..我想退出! :p


Windows 解决方案(Windows 7)

  • 编译器:MinGW g++ 4.5.0
  • 命令行:g++ -Wl,--enable-auto-import -O2 -fno-strict-aliasing -DWIN32_LEAN_AND_MEAN -D_UNICODE -DUNICODE -mwindows -Wall test.cpp -o test.exe
#include (windows.h)
#include (tchar.h)
#include (string)

typedef std::basic_string<TCHAR> ustring;

LONG StandardExtendedStyle;

TCHAR buffer_1[1024];
TCHAR buffer_2[1024];

static HWND button_1;
static HWND button_2;

inline int ErrMsg(const ustring& s)
{
 return MessageBox(0,s.c_str(),_T("ERROR"),MB_OK|MB_ICONEXCLAMATION);
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
 {
 case WM_CREATE:

 button_1=CreateWindow(L"button",L"UTF-8 Message",WS_CHILD|WS_VISIBLE,10,10,120,25,hwnd,(HMENU)1,NULL,NULL);
 button_2=CreateWindow(L"button",L"Exit",WS_CHILD|WS_VISIBLE,10,50,120,25,hwnd,(HMENU)2,NULL,NULL);

 break;
 
 case WM_COMMAND:
 
  switch(LOWORD(wParam))
  {

    case 1:

    _stprintf(buffer_1,L"اهلا بالعالم");
    _stprintf(buffer_2,L"Hello World in Arabic !");
    MessageBoxW(hwnd,buffer_1,buffer_2,MB_ICONINFORMATION|MB_OK|MB_RTLREADING|MB_RIGHT);

    break;

    case 2:

    PostQuitMessage(0);

    break;

  }break;
  
  case WM_CLOSE:

  DestroyWindow(hwnd);

  break;
  
  case WM_DESTROY:

  PostQuitMessage(0);

  break;
  
  default:
   return DefWindowProc(hwnd,uMsg,wParam,lParam);
 }
  return 0;
}

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR pStr,int nCmd)
{

 ustring classname=_T("window");
 WNDCLASSEX window={0};
 window.cbSize        = sizeof(WNDCLASSEX);
 window.lpfnWndProc   = WndProc;
 window.hInstance     = hInst;
 window.hIcon         = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(100), IMAGE_ICON, 16, 16, 0);
 window.hCursor       = reinterpret_cast<HCURSOR>(LoadImage(0,IDC_ARROW,IMAGE_CURSOR,0,0,LR_SHARED));
 window.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_BTNFACE+1);
 window.lpszClassName = classname.c_str(); 

 if (!RegisterClassEx(&window))
 {
   ErrMsg(_T("Failed to register wnd class"));return -1;
 }

 int desktopwidth=GetSystemMetrics(SM_CXSCREEN);
 int desktopheight=GetSystemMetrics(SM_CYSCREEN);

 HWND hwnd=CreateWindowEx(0,classname.c_str(),_T("The solution for Windows"),WS_OVERLAPPEDWINDOW,desktopwidth/4,desktopheight/4,270,150,0,0,
hInst,0);

 if (!hwnd)
 {
  ErrMsg(_T("Failed to create wnd"));
  return -1;
 }

 StandardExtendedStyle=GetWindowLong(hwnd,GWL_EXSTYLE);
 SetWindowLong(hwnd,GWL_EXSTYLE,StandardExtendedStyle|WS_EX_LAYOUTRTL);
 ShowWindow(hwnd,nCmd); 
 UpdateWindow(hwnd);
 MSG msg;
 while (GetMessage(&msg,0,0,0)>0)
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
 return static_cast<int>(msg.wParam);
}

注意:此应用程序仅附带 MSVCRT.DLL,这意味着它是本机 Windows C++ 应用程序。


Linux 解决方案

请帮忙!

如何在不告诉用户安装这个和这个..原生 Linux 应用程序的情况下在 Linux 上运行应用程序!

  • 文件格式必须是什么?精灵,斌...?
  • X11 是原生 Linux GUI 库吗?或 WxWidgets、QT、GTK+、gtkmm.. ???!!!
  • 可以在 Gnome 和 KDE 上运行吗?还是需要不同的代码源?

有人知道 Linux 的解决方案吗?


Mac OS X 的解决方案

请帮忙!

我认为 Mac OS X 的解决方案是 Cocoa in C++ with G++!但我不确定!

  • G++ 能否使用 Cocoa 构建原生 Mac OS 应用程序?

【问题讨论】:

  • 我认为您的意思是“API 级”应用程序,您可以编辑您的问题以指定它吗?另外,您所说的“完整”到底是什么意思?最简单的 Unicode API 级 Windows 应用只是在 main 中调用 MessageBox,仅此而已...
  • 是的,我的意思是 API 级别,Linux 上的等价物是什么? POSIX 和 GTK ? Mac 呢?可可?

标签: c++ user-interface utf-8 cross-platform native


【解决方案1】:

Qt。不是“本机”,但也不是 MFC、WPF、Silverlight ....

【讨论】:

  • 我更喜欢它而不是 wx,但我不想发动战争!如果这对您很重要,wx 的许可证会稍微灵活一些。
  • +1 用于 Qt。我们将它用于大型 Windows、Mac 和 Linux 应用程序,非常棒。
  • Qt 在 UI 质量方面可能是最差的。它臃肿、缓慢(由于软件渲染)、不使用本机控件(从版本 4 开始),并且具有无法使用的键盘界面。如果这还不够糟糕,你永远不知道明天谁拥有 Qt。奇趣科技?诺基亚?迪吉亚? Qt公司?其他人?另一方面,wxWidgets 确实使用本机控件,并生成整体上更好的 UI 质量应用程序。
【解决方案2】:

X11 有 NO 原生 GUI 库。学习 wxWidgets 并在所有三个平台上使用它。它将为您处理 Win32 和 Quartz 的接口。

【讨论】:

  • wxWidgets not native too.. 你需要将 wxWidgets dll 添加到 EXE 中才能运行,这意味着尺寸不小 ^_^
  • 我的时间通常比客户的下载带宽或硬盘空间更值得远远
  • 是的,您是对的,向应用程序添加一些千字节不是问题,您认为 wxWidgets 是最好的吗?或 gtkmm ? GTK+ ?
  • Quartz 目前还没有完整的 GTK+ 原生移植,所以暂时不用考虑。
  • @IgnacioVazquez-Abrams 的后代,现在肯定有!由Homebrew 的好人维护和轻松安装,对我来说非常有效。
【解决方案3】:

Windows API:

#undef  UNICODE
#define UNICODE
#include    <windows.h>

int main()
{
    MessageBox(
        0,
        L"اهلا بالعالم",
        L"Hello World in Arabic !",
        MB_ICONINFORMATION | MB_SETFOREGROUND
        );
}

使用 MinGW g++ 构建(生成 a.exe):

C:\test> g++ --version |找到“++”g++
(TDM-2 mingw32) 4.4.1

C:\test> g++ -O -pedantic -std=c++98 -Wall -Wwrite-strings -Wno-long-long -mwindows x.cpp

C:\test> _

使用 Visual C++ 构建(生成 x.exe):

C:\test> (cl /nologo- 2>&1) |找到“++”
微软 (R) 32 位 C/C++ 优化编译器版本 16.00.30319.01 为 80x86

C:\test> cl /nologo /EHsc /GR /Zc:forScope,wchar_t /W4 x.cpp /link user32.lib /子系统:windows /entry:mainCRTStartup
x.cpp

C:\test> _

我认为这是相当“完整”的,但不清楚“完整”是什么意思。

不管怎样,嗯。

【讨论】:

  • 谢谢 Steinbach,我在您的代码中添加了一个窗口,它解决了我关于 Windows 的问题,但是 Linux 和 Mac 呢?! ^_^
猜你喜欢
  • 1970-01-01
  • 2014-05-15
  • 2023-04-04
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多