`
soulmachine
  • 浏览: 112350 次
  • 性别: Icon_minigender_1
  • 来自: 湖北武汉
社区版块
存档分类
最新评论

请高人改写GUI版本的Hello world!

阅读更多

改这个程序好久,没有头绪,请圈子里的老大给个示范。要保持是Unicode版本,没有黑黑的控制台。

C++代码如下,在Visual Studio 2005下编译通过:

#include <windows.h><windows.h></windows.h>
#include <tchar.h><tchar.h></tchar.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hThisInstance,
     HINSTANCE hPrevInstance,
     LPSTR lpszArgument,
     int nCmdShow)
{
 /*  Make the class name into a global variable  */
 TCHAR szClassName[ ] = TEXT("HelloWorld");
 HWND hwnd;               /* This is the handle for our window */
 MSG messages;            /* Here messages to the application are saved */
 WNDCLASSEX wincl;        /* Data structure for the windowclass */

 /* The Window structure */
 wincl.hInstance = hThisInstance;
 wincl.lpszClassName = szClassName;
 wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
 wincl.style = CS_HREDRAW | CS_VREDRAW;    /* Catch double-clicks */
 wincl.cbSize = sizeof (WNDCLASSEX);

 /* Use default icon and mouse-pointer */
 wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
 wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
 wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
 wincl.lpszMenuName = NULL;                 /* No menu */
 wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
 wincl.cbWndExtra = 0;                      /* structure or the window instance */
 /* Use Windows's default colour as the background of the window */
 wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

 /* Register the window class, and if it fails quit the program */
 if (!RegisterClassEx (&wincl))
  return 0;

 /* The class is registered, let's create the program*/
 hwnd = CreateWindowEx (
  0,                   /* Extended possibilites for variation */
  szClassName,         /* Classname */
  TEXT("SDK Verision"),       /* Title Text */
  WS_OVERLAPPEDWINDOW, /* default window */
  CW_USEDEFAULT,       /* Windows decides the position */
  CW_USEDEFAULT,       /* where the window ends up on the screen */
  CW_USEDEFAULT,                 /* The programs width */
  CW_USEDEFAULT,                 /* and height in pixels */
  NULL,        /* The window is a child-window to desktop */
  NULL,                /* No menu */
  hThisInstance,       /* Program Instance handler */
  NULL                 /* No Window Creation data */
  );

 /* Make the window visible on the screen */
 ShowWindow (hwnd, nCmdShow);

 /* Run the message loop. It will run until GetMessage() returns 0 */
 while (GetMessage (&messages, NULL, 0, 0))
 {
  /* Translate virtual-key messages into character messages */
  TranslateMessage(&messages);
  /* Send message to WindowProcedure */
  DispatchMessage(&messages);
 }

 /* The program return-value is 0 - The value that PostQuitMessage() gave */
 return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 HDC  hdc;
 PAINTSTRUCT ps;
 RECT  rect;
 TCHAR  szHello[] = TEXT("Hello world!");

 switch (message)                  /* handle the messages */
 {
 case WM_PAINT:
  hdc = BeginPaint(hwnd,&ps); //begin painting
  GetClientRect(hwnd,&rect); //get the size of client area
  DrawText(hdc,szHello,_tcslen(szHello),&rect,DT_CENTER); //show "hello world"
  EndPaint(hwnd,&ps); //end painting
  break;
 case WM_DESTROY:
  PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
  break;
 default:                      /* for messages that we don't deal with */
  return DefWindowProc (hwnd, message, wParam, lParam);
 }

 return 0;
}

分享到:
评论
13 楼 tomqyp 2007-04-29  
编译时加上 -L/exet:nt/su:windows:4.0这个开关就没有控制台了吧
12 楼 smithfox 2007-04-28  
用 dmd main.d main.def
编译
11 楼 smithfox 2007-04-28  
还要写一个main.def
内容为:
EXETYPE NT
SUBSYSTEM WINDOWS,5.0
10 楼 smithfox 2007-04-28  
/* Compile with:
* dmd main.d
*  请存为main.d,并且在UtrlEdit中将格式转换为UTF-8
*  我测试用bud编译时,链接不了,但是用dmd直接编译链接是可以地
*/

import std.c.windows.windows;
import std.c.stdio;
extern(Windows){
int DrawTextA(
HDC hDC,          // handle to device context
LPCSTR lpString, // pointer to string to draw
int nCount,       // string length, in characters
LPRECT lpRect,    // pointer to struct with formatting dimensions
UINT uFormat      // text-drawing flags
);
int DrawTextW(
HDC hDC,          // handle to device context
LPCWSTR lpString, // pointer to string to draw
int nCount,       // string length, in characters
LPRECT lpRect,    // pointer to struct with formatting dimensions
UINT uFormat      // text-drawing flags
);
}

extern(Windows)
int WindowProc(HWND hWnd, uint uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_PAINT:
PAINTSTRUCT ps;
HDC dc = BeginPaint(hWnd, &ps);
RECT r;
GetClientRect(hWnd, &r);
wchar[] greeting = "这是一个测试!";

  DrawTextW(dc,greeting.ptr,greeting.length,&r,0); //show "hello world"
  EndPaint(hWnd, &ps);
  break;
    case WM_DESTROY:
PostQuitMessage(0);
break;
    default:
    break;
}
return DefWindowProcA(hWnd, uMsg, wParam, lParam);
}

int doit()
{
HINSTANCE hInst = GetModuleHandleA(null);
WNDCLASS wc;
wc.lpszClassName = "DWndClass";
wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = &WindowProc;
//wc.lpfnWndProc=nnd;
wc.hInstance = hInst;
wc.hIcon = LoadIconA(cast(HINSTANCE) null, IDI_APPLICATION);
wc.hCursor = LoadCursorA(cast(HINSTANCE) null, IDC_ARROW);
wc.hbrBackground = cast(HBRUSH) (COLOR_WINDOW + 1);
wc.lpszMenuName = null;
wc.cbClsExtra = wc.cbWndExtra = 0;
wc.hbrBackground = cast(HBRUSH) COLOR_BACKGROUND;
auto a = RegisterClassA(&wc);
assert(a);

HWND hWnd, btnClick, btnDontClick;
hWnd = CreateWindowA("DWndClass", "Just a window", WS_THICKFRAME |
WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, HWND_DESKTOP,
cast(HMENU) null, hInst, null);
assert(hWnd);

MSG msg;
while (GetMessageA(&msg, cast(HWND) null, 0, 0))
{
TranslateMessage(&msg);
DispatchMessageA(&msg);
}

return 1;
}

/**********************************************************/

/* Note the similarity of this code to the console D startup
* code in \dmd\src\phobos\dmain2.d
* You'll also need a .def file with at least the following in it:
* EXETYPE NT
* SUBSYSTEM WINDOWS
*/

int main()
{
    int result;

    try
    {
result = doit(); // insert user code here
    }
    catch (Object o) // catch any uncaught exceptions
    {
MessageBoxA(null, cast(char *)o.toString(), "Error",MB_OK | MB_ICONEXCLAMATION);
result = 0; // failed
    }

    return result;
}
9 楼 oldrev 2007-04-28  
D程序内部一般用utf-8,A结尾API用的是MBS,转换起来很麻烦,std.windows.registry就是没考虑到这点所以不支持中文。要用Win32API 还是用 W 的好,toUtf16z 就行了,这样避免NT内核再转换一次效率也比较高
8 楼 Colorful 2007-04-28  
为什么不能用W的WinAPI?
phobos库导入以A为结尾的API,NT内核会把这样的API自动转换成以W为结尾的,虽然不是所有的API都会转换。
7 楼 shawind 2007-04-28  
是的,有很多W的winapi不能用。
6 楼 soulmachine 2007-04-28  
好多Win32 API都不能用,让人郁闷啊
5 楼 oldrev 2007-04-28  
编译的时候加上 winsamp.def,就没有控制台了
unicode 的只要把 API 换成 W 结尾的不就行了,不过 phobos 里没有声明 unicode API  的原型,你可以选择使用 tango 或用 dousrce.org/projects/bindings 里的 win32 项目
4 楼 soulmachine 2007-04-28  
那个例子首先不是unicode版本的,其次启动时有个黑黑的控制台
3 楼 oldrev 2007-04-28  
/dmd/samples/winsamp.d
2 楼 qiezi 2007-04-28  
DMD里不是有个例子嘛。
1 楼 soulmachine 2007-04-28  
开头是#include <windows.h>和#include <tchar.h>,怎么无故不见了?

相关推荐

    诗织:诗织! 是片假名的改写版本! 哦! 服务器在使用时提供更快,稳定和可扩展的体验

    这是片假名的旧大须的改写版本! bancho仿真器,在使用时可提供更快,更稳定和可扩展的体验。安装诗织! 需要运行 v8 +。 安装依赖项并启动服务器。 $ cd shiori$ npm install$ node shiori外挂程式诗织! 目前已...

    【Asp.Net MVC 入门Hello World】一步一步改写简单的登录注册(一)

    Asp.Net MVC 是微软开发的一款用于构建Web应用程序的框架,它基于Model-View-Controller (MVC)设计模式,提供了一种分离关注点的方式,使开发者可以更清晰地组织代码,提高可测试性和可维护性。...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    我们这里的工程名为helloworld。 6.这时软件自动添加基本的头文件,因为这个程序我们不需要其他的功能,所以 直接点击Next。 7.我们将base class 选为QDialog 对话框类。然后点击Next。 8.点击Finish,完成工程的...

    常用嵌入式GUI比较

    "嵌入式GUI比较" 嵌入式GUI(Graphical User Interface)是嵌入式系统中不可或缺的一部分,它提供了人机交互的接口,帮助非专业用户更方便地使用嵌入式系统。当前,嵌入式Linux系统中有多种GUI解决方案,本文将对...

    jiaozhu.zip 教主 Oracle SQL改写优化 2.0版

    教主Oracle SQL高级查询优化改写完美培训视频 2.0版,这个我参与培训的,包含视频、SQL文件、教学文档内容完整,分享给大家学习,共同努力进阶转型开发DBA,人称教主,做sql改写十多年了,sql改写功底很强!

    VC版本改写的变色龙按钮

    我将它改写为一个VC版本。但是该版本比2.0.6B有点删减,比如说gonchuki支持的按钮快捷键我改写的不支持。 另外,我新加了一种Graphic按钮类型,该类型按钮显示4个图片:通常状态图片、按下图片、鼠标移动在按钮上时...

    Oracle查询优化改写 技巧与案例_高清带书签版本

    《Oracle查询优化改写技巧与案例》不讲具体语法,只是以案例的形式介绍各种查询语句的用法。第1~4章是基础部分,讲述了常用的各种基础语句,以及常见的错误和正确语句的写法。这部分的内容应熟练掌握,因为日常查询...

    《Oracle查询优化改写技巧与案例》PDF版本下载.txt

    根据提供的文件信息,本文将对《Oracle查询优化改写技巧与案例》这一主题进行详细的解析,涵盖Oracle查询优化的基本概念、重要性、改写技巧及其实际应用案例。 ### 一、Oracle查询优化概述 #### 1.1 查询优化定义 ...

    Oracle查询优化改写技巧与案例

    《Oracle查询优化改写技巧与案例》不讲具体语法,只是以案例的形式介绍各种查询语句的用法。第1~4章是基础部分,讲述了常用的各种基础语句,以及常见的错误和正确语句的写法。这部分的内容应熟练掌握,因为日常查询...

    Oracle查询优化改写技巧与案例2.zip

    《Oracle查询优化改写技巧与案例》不讲具体语法,只是以案例的形式介绍各种查询语句的用法。第1~4章是基础部分,讲述了常用的各种基础语句,以及常见的错误和正确语句的写法。这部分的内容应熟练掌握,因为日常查询...

    汇编第二次实验实验报告.docx

    - 改写内存中的字符串,如将 "world" 改为 "WORLD",可以通过 `E` 命令实现,然后显示修改后的结果。 - 去掉字符串定义语句 `MESS DB 'Hello, World!', 0DH, 0AH, 24H`,程序依然能汇编连接,但缺少字符串,输出...

    精品课件资料用C语言编写程序.ppt

    本课件将深入浅出地介绍如何使用C语言编写程序,从最基础的"Hello World"程序开始,逐步深入到变量、数据类型、运算符和表达式等核心概念。 一、打印"Hello World" C语言的入门程序通常从打印"Hello World"开始。...

    Python多线程处理实例详解【单进程/多进程】

    print('Hello world!!!', i) time.sleep(1) for n in range(10): say_hi(n) ``` 在这个例子中,每个`say_hi`函数调用都会等待上一个调用完成后再执行,因此整个过程是按顺序执行的。 **多进程**则是指将任务...

    GuiLib 115 vc2005源代码

    工程中用到GuiLib发现其原来的程序是vc6的 直接移植到2005上来有很多地方编不过,而且不支持unicode,于是改了改,并去掉了其静态库工程改写了一下Guilib.h文件,方便使用习惯。 传上来分享。

    递归程序用栈改写为非递归

    C语言,将一个递归程序用栈改写为非递归,其中用到栈的基本操作

    java-业务需求需要根据经纬度计算面积,整理了一下根据经纬度计算面积,根据openlayers借鉴改写,亲测可用

    java-业务需求需要根据经纬度计算面积,整理了一下根据经纬度计算面积,根据openlayers借鉴改写,亲测可用!

    改写proxool(spring)

    改写了proxool,让他支持spring注入 当用spring注入时间的时候,跑起来spring会报错。 是因为里面类似不一致的问题。改写之后,跑起来不会有问题

    Oracle查询优化改写 技巧与案例.pdf

    Oracle查询优化改写 技巧与案例.pdf

Global site tag (gtag.js) - Google Analytics