上次写一个minigui程序时的一点点小结。(08.01.16)
1、处理MSG_PAINT消息,即使没有东西要处理,也必须加上:
hdc=GetClientDC(hWnd);
ReleaseDC(hdc);
两句话,否则会有想不到的界面绘制错误。
2、旋钮数字框(autospin),在设定上下限时,注意:WPARAM中放最小值,LPARAM中放最大值,这个和编程指南上有点出入(编程指南上原话为:设定可取的最大值和最小值,分别取 wParam 参数和 lParam参数的值)。
3、注意:旋钮数字框(autospin),步进时候都是整数步进的,不能以小数步进。
4、不要往空指针写东西。例如:char *p; sprintf(p, "%d", 50);这样写是不对的,在运行时会出现意想不到的错误。可以写成这样:char p[10]; sprintf(p, "%d", 50);
5、Makefile的命令行要以TAB键开头。
6、其他文件用不到的函数,我们可以定义成static,但是若其他文件要调用此函数,千万不要加static,默认为extern。
7、画波形函数放在MSG_PAINT消息里,每次窗口重叠过后,都要进行重绘,否则被重叠的部分将不再显示。
8、截图只截取需要的范围,截大的话可能会导致截到的位图不正确,比如是倾斜的。
9、创建菜单时,memset (&mii, 0, sizeof(MENUITEMINFO));这句话不可省略,否则会出错。
10、定义了一个FILEDLGDATA结构,然后再截图保存位图时候,GetBitmapFromDC()出问题;若不定义FILEDLGDATA结构,没有什么为题。
GDB调试,发现具体是GetBitmapFromDC()中GAL_memcpy (dstrow, srcrow, linelen);这个函数出了问题。再print dstrow 查看这个环境变量,发现:
(gdb) print dstrow
$1 = (Uint8 *) 0xf0ff
上网请教后解决。原因如下:
bitmap要调用函数InitBitmap()初始化位图文件。BITMAP里面的数据结构只保存了位图数据的指针,而不是数值 。
11、创建位图型按钮时,
CreateWindow (CTRL_BUTTON, // PRCONIG
"右",
WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE | BS_BITMAP,
IDC_RIGHTBUTTON,
405, 395, 41, 26, hWnd, &struc_bmp[3].bmp); 注意,最后一个参数是BITMAP类型的指针,注意是指针!
12、尽量少用指针,如果要用到地址,可以对一个变量使用&取地址符号;指针虽然带来了很多好处,但是写程序时,容易出现混乱,所以最好使用变量,然后使用&取地址符号。假如确实需要使用指针,最好用malloc、calloc等函数动态分配一个大小的空间,如果不分配,可能会出现“段错误”或者程序异常结束等空间不可使用的错误。
13、字符串之间传递时,不可用“=”赋值号直接赋值,要使用字符串函数strcpy()函数进行拷贝。这点说起来都知道,但是实际用起来,容易忘记,值得注意。
阅读(2578) | 评论(0) | 转发(0) |