星期一, 七月 20, 2009

c string to wxstring

wxwidgets的字符串转换的确让人发狂

c++ string如何转换为wxString就需要耐心。

这里是一些文章:

http://wiki.wxwidgets.org/WxString#Converting_a_Normal_String_to_a_wxString

实际的语法是这样的:
string result="hello world";

wxMessageBox(wxString(result.c_str(), wxConvUTF8));

char* chars = "你好,世界!";

c string to wxstring

wxwidgets的字符串转换的确让人发狂

c++ string如何转换为wxString就需要耐心。

这里是一些文章:

http://wiki.wxwidgets.org/WxString#Converting_a_Normal_String_to_a_wxString

实际的语法是这样的:
string result="hello world";

wxMessageBox(wxString(result.c_str(), wxConvUTF8));

boost 编译如何做?

如果安装了mingw,可以用gcc来编译boost.
在编译之前,必须首先装了cybgin或mingw或者visual c++ studio 2008,免费版本的可以在网络上直接下载.

在编辑boost必须手边编译好bjam.
这个在下载的boost 1.39解压缩的包里的:boost_1_39_0\tools\jam
在安装了vs c++ studio 2008或gcc之后就可以直接运行:build_dist.bat
如果要gcc.修改文件最后一句call .\build.bat 为 call .\build.bat gcc
就可以了。

boost编译完后,可以把所有lib和头文件复制到一个指定的目录下
这个动作需要在命令行指定install 参数

编译好bjam后,复制到安装的boost根目录下.
然后可以直接运行bjam了。

标准编译的,支持多线程,用gcc编译,编译的选项包括:
bjam install --toolset=gcc --prefix="c:\boost_1_38_0" release toolset=gcc threading=multi link=static


注意:如果不指定toolset和prefix选项,boost默认使用 mscv编译
和c:\boost_1_39_0目录安装

boost编译支持的选项可以通过bjam --help 来查看。意思如下:


--build-dir= 编译的临时文件会放在builddir里(编译完就可删除)

--stagedir= 存放编译后库文件的路径,默认是stage

--build-type=complete 编译所有版本(确切地说是相当于:variant=release, threading=multi;

link=shared|static;runtime-link=shared)

variant=debug|release 编译什么版本(Debug or Release?)

link=static|shared 使用静态库还是动态库。

threading=single|multi 单线程还是多线程库。

runtime-link=static|shared 决定是静态还是动态链接C/C++标准库。

--with- 只编译指定的库,如输入--with-regex就只编译regex库了。

--show-libraries 显示需要编译的库名称

星期五, 七月 10, 2009

wxGrid如何catch key event?

在wxWidgets 2.8.10中,
想让wxGrid catch 键盘事件,比如光标,必须在建立wxGrid的时候,需要加入wxWANTS_CHARS.

Grid1 = new wxGrid(Panel1, ID_GRID1, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS, _T("ID_GRID1"));

其次:
加入事件定义,比如如下:

Connect(ID_GRID1,wxEVT_GRID_SELECT_CELL,(wxObjectEventFunction)&bonusFrame::OnGrid1CellLeftClick);

如下:
void bonusFrame::OnGrid1CellLeftClick(wxGridEvent& ev)
{
wxLogMessage(_T("Left click at row %d, col %d"), ev.GetRow(), ev.GetCol());
ev.Skip();//必须的。
}

这样就可以获得键盘光标事件了
经过一些列的需求驱动,发现了如何在wxFrame下,如何定义热键的方法
wxWidgets设计的非常的糟糕。
这里的文章很全面:

http://wiki.wxwidgets.org/Catching_key_events_globally

星期三, 七月 01, 2009

如何在唯一的wxWidgets执行文件中包含资源数据的步骤

编写xrc文件,手工编写是要让人崩溃的,可以下载http://wxformbuilder.org/ 下载用来
工具制作xrc文件

wxWidgets for C++从资源文件中静态装载图像


在wxWidgets中装载图像是非常容易的,但是如果将图像文件和可执行文件放到一起,在发布时只需要发布可执行文件,要实现这种功能,一般可以使用资 源文件来解决。在windows下的资源文件的源文件是*.rc,编译后叫*.res。在linux下类似,源文件为*.xrc,编译后叫*.xres。 但它们是xml格式的,要装载这种资源文件也得动态进行装载。相当于配置文件。

如果想将其直接编译进可执行文件。需要一个工具wxrc。这个工作在wxWidgets中的utils/wxrc目录中,可自己编译,mingw32-make -f makefile.gcc UNICODE=1 BUILD=release。可使用这个工具将*.xrc 生成c++代码,如果是图像,就将其转换成字符数组。然后和其它程序一起进行编译。可使用wxrc -c main.xrc -v -o main.h

main.xrc的格式如下:
<?xml version="1.0"?>
<resource version="2.3.0.1">
<object class="wxBitmap" name="background">background.jpg</object>
</resource>

生成的main.h的格式如下:

//
// This file was automatically generated by wxrc, do not edit by hand.
//

#include
<wx/wxprec.h>

#ifdef __BORLANDC__
#pragma hdrstop

在Visual C++的项目中添加XRC文件
虽然wxWidgets提供了XRC文件的编译器,但是把XRC的文件直接添加到Visual C++的项目中的话确没有任何效果,因为Visual C++默认能够处理的文件类型并不包含XRC文件。其实通过Visual C++的"自定义生成步骤"可以让XRC文件被自动编译:



引用:
打开项目中XRC文件的属性页。
选择"自定义生成步骤"。
在"命令行"处输入" /c /o $(InputDir)$(InputName).cpp $(InputPath)"。
在"输出"处输入"$(InputDir)$(InputName).cpp"。
在"附加依赖项"处输入XRC文件里引用的资源文件名(比如图片文件之类的),让这些资源文件被更新时XRC文件也会被重新编译。
按"确定"按钮关闭属性页。
编译XRC文件产生一个同名的C++源文件。
把XRC文件的目录下同名的C++源文件添加到项目中。
完成上步骤后,就可以让Visual C++自动把XRC文件的内容集成到二进制程序中了,以后XRC文件如果有什么改动,生成项目时会自动更新二进制程序里的XRC内容。


6 获得Windows应用程序实例句柄
声明如下函数:
代码:
    extern "C"
{
WXDLLIMPEXP_BASE HINSTANCE wxGetInstance();


}
这是wxWidgets内部使用的函数,用于获得HINSTANCE类型的。Windows应用程序实例句柄。

wxGridCellAttr SetTextColour windowXP得到异常

wxGridCellAttr SetTextColour exception
wxGridCellAttr *attrRed = new wxGridCellAttr();
attrRed->SetTextColour(wxColour(wxT("#0000ff")));
得到异常。
修改为以下语句则正常工作:

attrRed->SetTextColour(wxColour(0,0,255));

class静态成员变量link时候出现 undefined reference 错误

例子:
头文件
a.h
class a
{
public:
 static string a;
}

a.cpp
// declare class static objects
string a::format;
这样就可以解决这种link出现的  undefined reference 的错误