Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 5669|回复: 8

装完Lazarus,立马编译一个带窗体的程序,执行文件大小:70.4 KB,但中文 乱码了 ...

[复制链接]

该用户从未签到

发表于 2015-1-23 09:04:57 | 显示全部楼层 |阅读模式
本帖最后由 canglong 于 2015-1-23 09:25 编辑

装完Lazarus,立马编译一个带窗体的程序,执行文件大小:70.4 KB,但中文 乱码了 ...
  1. program WindowDemo;

  2. uses  Windows,  Messages;

  3. // 窗口函数,窗口接到消息时被Windows所调用

  4. function WindowProc(hwnd : HWND; uMsg : Cardinal; wParam : WPARAM;

  5. lParam : LPARAM) : LResult; stdcall;

  6. begin

  7. Result := 0;

  8. case uMsg of

  9. // 关闭窗口消息,当用户关闭窗口后,通知主消息循环结束程序

  10. WM_CLOSE : PostMessage(hwnd, WM_QUIT, 0, 0);

  11. // 鼠标左键按下消息

  12. WM_LBUTTONDOWN : MessageBox(hwnd, 'Hello! 您好', '和您打个招呼',

  13. MB_ICONINFORMATION);

  14. else

  15. // 其他消息做默认处理

  16. Result := DefWindowProc(hWnd, uMsg, wParam, lParam);

  17. end;

  18. end;

  19. var

  20. wndcls : WNDCLASS; // 窗口类的记录(结构)类型

  21. hWnd : THandle;

  22. Msg : tagMSG; // 消息类型

  23. begin

  24. wndcls.style := CS_DBLCLKS; // 允许窗口接受鼠标双击

  25. wndcls.lpfnWndProc := @WindowProc; // 为窗口类指定窗口函数

  26. wndcls.cbClsExtra := 0;

  27. wndcls.cbWndExtra := 0;

  28. wndcls.hInstance := hInstance;

  29. wndcls.hIcon := 0;

  30. wndcls.hCursor := LoadCursor(hInstance, 'IDC_ARROW');

  31. wndcls.hbrBackground := COLOR_WINDOWFRAME;

  32. wndcls.lpszMenuName := nil;

  33. wndcls.lpszClassName := 'WindowClassDemo'; // 窗口类名称

  34. // 注册窗口类

  35. if RegisterClass(wndcls) = 0 then

  36. Exit;

  37. // 创建窗口

  38. hWnd := CreateWindow(

  39. 'WindowClassDemo', // 窗口类名称

  40. 'WindowDemo', // 窗口名称

  41. WS_BORDER or WS_CAPTION or WS_SYSMENU, // 窗口类型

  42. Integer(CW_USEDEFAULT),

  43. Integer(CW_USEDEFAULT),

  44. Integer(CW_USEDEFAULT),

  45. Integer(CW_USEDEFAULT),

  46. 0,

  47. 0,

  48. hInstance,

  49. nil

  50. );

  51. if hWnd = 0 then

  52. Exit;

  53. // 显示窗口

  54. ShowWindow(hWnd, SW_SHOWNORMAL);

  55. UpdateWindow(hWnd);

  56. // 创建主消息循环,处理消息队列中的消息并分发

  57. // 直至收到WM_QUIT消息,退出主消息循环,并结束程序

  58. // WM_QUIT消息由PostMessage()函数发送

  59. while GetMessage(Msg, hWnd, 0, 0) do

  60. begin

  61. TranslateMessage(Msg);

  62. DispatchMessage(Msg);

  63. end;

  64. end.
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册(注册审核可向QQ群索取)

x
回复

使用道具 举报

  • TA的每日心情

    2021-8-18 08:54
  • 签到天数: 1421 天

    [LV.10]以坛为家III

    发表于 2015-1-23 11:48:17 | 显示全部楼层
    因为Lazarus默认的是UTF8格式,而Windows使用的是Ansi格式,所以您需要使用UTF8ToAnsi转换字符。
    将您的MessageBox那一句改为
    WM_LBUTTONDOWN : MessageBox(hwnd, PChar(UTF8ToAnsi('Hello! 您好')),PChar(UTF8ToAnsi('和您打个招呼')),

    MB_ICONINFORMATION);
    这样就可以正确显示中文字符了。


    Good Luck~

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册(注册审核可向QQ群索取)

    x
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2015-1-23 15:06:51 | 显示全部楼层
    好的,非常感谢楼上 ! 对了,编译选项等 还可以优化的么,我是默认的设置,Lazarus编译后感觉还是大了点,记得之前 Delphi 编译的也就几k左右的,而现在有70多K,还有优化的空间的对吧
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2015-1-23 15:54:12 | 显示全部楼层
    我把 []为GDB产生调试信息 的 钩去掉后,执行文件可以减到 30 来 K  ...
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-3-1 22:40
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2015-1-23 16:24:28 | 显示全部楼层
    设成release就可以小很多了,默认是debug
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2015-1-23 17:08:21 | 显示全部楼层
    ok,取消 “为GDB产生调试信息”和 设为 Release 都好像 差不多,都是 35K  ,谢谢
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-1-26 10:18:07 | 显示全部楼层
    我的不是啊,我的取消GDB产生调试信息和 设为 Release 后编译一个创建的窗口其他都没有就1.76M了,你们编译出来的这么小?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-3-1 22:40
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2015-1-26 23:40:23 | 显示全部楼层
    苍云 发表于 2015-1-26 10:18
    我的不是啊,我的取消GDB产生调试信息和 设为 Release 后编译一个创建的窗口其他都没有就1.76M了,你们编译出 ...

    人家用的是windows api ,我们的不是
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-1-28 12:21:07 | 显示全部楼层
    不明觉厉
    回复 支持 反对

    使用道具 举报

    *滑块验证:

    本版积分规则

    QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

    GMT+8, 2025-5-2 21:16 , Processed in 0.029799 second(s), 10 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表