Profiel van 鉴鉴赏空间Foto'sWeblogLijsten Extra Help

Weblog


    26 december

    MFC中常用类, 宏, 函数介绍(转载)

     
    //-----------------------------------------
     
    常用类
    CRect:用来表示矩形的类,拥有四个成员变量:top left bottom right。分别表是左上角和右下角的坐标。可以通过以下的方法构造:
    • CRect( int l, int t, int r, int b ); 指明四个坐标
    • CRect( const RECT& srcRect ); 由RECT结构构造
    • CRect( LPCRECT lpSrcRect ); 由RECT结构构造
    • CRect( POINT point, SIZE size ); 有左上角坐标和尺寸构造
    • CRect( POINT topLeft, POINT bottomRight ); 有两点坐标构造

    下面介绍几个成员函数:

    • int Width( ) const; 得到宽度
    • int Height( ) const; 得到高度
    • CSize Size( ) const; 得到尺寸
    • CPoint& TopLeft( ); 得到左上角坐标
    • CPoint& BottomRight( ); 得到右下角坐标
    • CPoint CenterPoint( ) const; 得当中心坐标
    此外矩形可以和点(CPoint)相加进行位移,和另一个矩形相加得到“并”操作后的矩形。

    CPoint:用来表示一个点的坐标,有两个成员变量:x y。 可以和另一个点相加。

    CString:用来表示可变长度的字符串。使用CString可不指明内存大小,CString会根据需要自行分配。下面介绍几个成员函数:

    • GetLength 得到字符串长度
    • GetAt 得到指定位置处的字符
    • operator + 相当于strcat
    • void Format( LPCTSTR lpszFormat, ... ); 相当于sprintf
    • Find 查找指定字符,字符串
    • Compare 比较
    • CompareNoCase 不区分大小写比较
    • MakeUpper 改为小写
    • MakeLower 改为大写

    CStringArray:用来表示可变长度的字符串数组。数组中每一个元素为CString对象的实例。下面介绍几个成员函数:

    • Add 增加CString
    • RemoveAt 删除指定位置CString对象
    • RemoveAll 删除数组中所有CString对象
    • GetAt 得到指定位置的CString对象
    • SetAt 修改指定位置的CString对象
    • InsertAt 在某一位置插入CString对象

    常用宏

    RGB

    TRACE

    ASSERT

    VERIFY

    常用函数

    CWindApp* AfxGetApp();

    HINSTANCE AfxGetInstanceHandle( );

    HINSTANCE AfxGetResourceHandle( );

    int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );用于弹出一个消息框

     

    30 november

    学用Gimp Script-FU编程 (转载)

    昨天闲来无事翻到一个前几天得贴子说gimp不能画圆,然后有兄弟比较PS和gimp孰优孰劣。
    其实这两个软件各有所长,PS的新版本非常强大,gimp总体比较我觉得优于PS5,用起来没有PS6那么舒服了。
    PS在路经的功能方面比gimp强很多。而gimp有script-FU做基础也不输给PS的其他方面多少,甚至说script的扩展性使得gimp给予使用者更多的自己发挥的空间。你可以在gimp上面完成很多在PS下面不可完成的任务。
    我要写有关script的东西,但是既然提到了画圆,先说说怎么简单的画一些图形。
    比如我要画圆
    1. 用圆形选择工具画出你想画的形状。
    2. 选择颜色和画笔
    3. 在图片上面右键,选择 编辑》勾画
    (如果要精确一些的话,可以在圆形选取的时候打开“工具配置”给圆形选区指定固定的宽高比例。)
    这是第一种方法,有gimp丰富的可随意扩展的画笔做后盾,你可以画出很多有意思的东西
    第二中方法。
    1. 建立圆形选区
    2. 在图片上面右键 选择 》边界
    3. 指定你要勾画的线宽
    4. 图片右键 编辑 》填充
    附件里面是一个用这些方法画出来的东西,其实在PS5里面我记得没有画圆工具想画一个圆挺麻烦的。相比之下gimp要比ps5强一些
    注:gimp版本1.2
    说了现有的命令,下面看看怎么用script-FU来扩展gimp的功能。
    下面是一段小代码,我先贴上来慢慢加注释。
    拷贝粘贴存为一个文件放到目录
    ~/.gimp-1.2/scripts/
    (这个目录根据不同的版本会不一样哦,自己用TAB键试试就职到了。)
    然后重起gimp或者选择菜单 xtns 》script-fu 》刷新
    接着在任意一个图片上面点右键,选择 script-fu 》linuxsir 》draw circle
    选择好你想用的颜色,选择圆心,半径,线宽。
     
    源码:--------------------------------------------------------------------------------
    ; define 和下面看到的let是脚本里面基本的保留子
    ; 世界上还有几个小教程可以看 在google上面找一下
    ; script fu tutorial. 应该可以学会这些基本的语法.
    (define (doooom-draw-circle image drawable cx cy r thick)
    ; 这里dooom...circle是函数名 后面的几个参数是从
    ; 对话框传递过来的变量, 具体看下面的register
     (let* (
    (up_corner_x (- cx r))
    ; up....x是被副职的变量,后面是副的值.
    ; (- cx r) 就是 cx-r 的意思.
    (up_corner_y (- cy r))
    (height (* r 2))
     )
     (gimp-selection-clear image) ; 清空选区
     (gimp-ellipse-select image (- up_corner_x thick) (- up_corner_y thick)
      (+ height (* thick 2)) (+ height (* thick 2)) 0 FALSE 0 0)
    ; 按照给定值选择一个椭圆选区
     (gimp-ellipse-select image up_corner_x up_corner_y
     height height 1 FALSE 0 0)
    ; 选择一个小一些的圆, 并且和前面的选区做"减"运算
     (gimp-edit-fill drawable 0)
    ; 填充选区, 用前景色
     (gimp-selection-clear image)
       (gimp-displays-flush)
    ; 清除选区并且刷新图象
    ; 如果不刷新图象是不会update到已有的变化的
     )
     )
    ; ========================================
    ; 下面的部分在你的gimp里面注册这个脚本
    ; dooo...circle是你的程序入口, <image> 是说明添加到
    ; 右键菜单, 后面是一层层的菜单名称, 可以随便写
    ; 也就是说你的脚本可以作为一个entry添加到菜单的
    ; 任何位置.
    (script-fu-register "doooom-draw-circle"
      "<Image>/Script-Fu/Linuxsir/Draw Circle..."
      "Draw a circle with given center and radius"
      "doooom at linuxsir"
      "doooom"
      "June 2003"
      ""
      SF-IMAGE "Image" 0
      SF-DRAWABLE "Drawable" 0
      SF-VALUE "Center X" "5"
      SF-VALUE "Center Y" "5"
      SF-VALUE "Radius" "4"
      SF-VALUE "Thick" "3"
      )
    ; SF-image 和SF-DR... 是右键菜单脚本特有的
    ; 他返回了当前操作的位置. 省下的很简单
    ; 就是定义菜单和缺省值
    --------------------------------------------------------------------------------

    另外我说一下, 脚本编写的问题, 你可以用任何的编辑器了哦。分号是注释。
    我是把这些脚本存为扩展名为scm的文件,应该存成别的名字也行。
    从gimp主菜单 xtns 》script-fu 》console 可以调出script的控制台。这里面可以实验你的语句。从控制台可以调出script列表,这个非常有用,看一下就知道了,嘿嘿。
    调试脚本我没有什么特别好的方法,就是一句一句注释一下调试的,
    有啥好方法,大生们多多赐教。
    比如你可以画出这样的精确的东西,好象PS不太好做。
     
    ps:如果看不到图,加一个出国代理。
    script-fu就是一系列gimp动作,会photoshop的兄弟会说我们可以在ps里面用action同样可以记录动作而且狠方便,调节度也很大。但是script-fu作为从lisp衍生出来的一种东东,功能远不止是批处理。
    你可以在script里面实现数学计算,if,while流程控制,甚至是子程序调用。下面看看怎么用了哦。NOW WE CAN START REAL ROCK&ROLL。HEI HEI
    下面这个代码是一个简单的递归调用绘制一个分形图案 ( PS卫道者要吐血了 ),很久不写程序了各位学CS的大哥不要因为丑陋的代码来砍我。
    还是拷贝到那个目录,然后更新script-fu,这里我随便插一句,你每次改动了你的脚本的时候都要更新script,才可以在gimp里面生效。
     
    源码:--------------------------------------------------------------------------------
    ; 下面这个小routine是从yahoo的script-fu group抄来的
    ; 有一些小改动, 注意这个里面使用了浮点数组, 嘿嘿
    ; script 强吧.  yahoo那个group不错, 可以看看
    (define (script-drawline img xcoord ycoord xcoord2 ycoord2)
     (set! thecoords (cons-array 6 'double))
     (aset thecoords 0 xcoord)
     (aset thecoords 1 ycoord)
     (aset thecoords 2 xcoord2)
     (aset thecoords 3 ycoord2)
     (gimp-pencil (car (gimp-image-active-drawable img)) 4 thecoords)
    ; 这里的 (car (gimp-image-active-drawable img)) 狠有用
    ; 是从当前image提取drawable, 我还不太明白啥是drawable
    ; 但是有这个语句就无所谓了.
     (gimp-displays-flush)
      )
    (define (draw-edge image sx sy fx fy)
     (let* ( ; 下面是一堆付值和计算, 当笑话看吧,
       (distance (sqrt (+ (pow (- sx fx) 2)
        (pow (- fy sy) 2))))
       (xstep (/ (- fx sx) 3))
       (ystep (/ (- fy sy) 3))
       (c1x (+ sx xstep))
       (c1y (+ sy ystep))
       (vertexx (- (+ c1x (/ xstep 2)) (* ystep 0.86603)))
       (vertexy (+ (+ c1y (/ ystep 2)) (* xstep 0.86603)))
       (c2x (+ c1x xstep))
       (c2y (+ c1y ystep))
       )
       (if (> distance 1)
    ; if是一个狠tricky的语句, 费了我不少心思figure out 文档太少了
    ; if 后面的是 逻辑判断, 一目了然, TRUE或者1 FALSE或者0
    ; 逻辑判断后面的 ( ) 是如果为真的时候执行的语句
    ; 不是象有一个xx文档说的是好几条, 只能有一条哦.
    ; (begin .... ) 的结构是符合语句
    ; 然后在后面第二个 ( ) 是else时候执行的.
        (begin
        (script-drawline image c1x c1y sx sy)
        (script-drawline image c2x c2y fx fy)
         (draw-edge image vertexx vertexy c2x c2y)
        (draw-edge image c1x c1y vertexx vertexy)
    ; 调用画线的程序和递归.  
       ))
       )
     )
    (define (doooom-fractal-art width)
     (let* ((image (car (gimp-image-new width (/ width 3) RGB)))
            (layer (car (gimp-layer-new image width (/ width 3)
                         RGB-IMAGE "foobar" 100 NORMAL-MODE))) )
           (gimp-drawable-fill layer BG-IMAGE-FILL)
           (gimp-image-add-layer image layer 0)
           (gimp-display-new image)
    ; 前面这一部分也是抄的, 建立一个新图象, 加一个新layer
    ; 具体可以参见那个文档,你肯定从google里面找到了
    ; 因为一共就那么几个文档, 呵呵
     (draw-edge image 0  4 (- width 1) 4 )
     (gimp-displays-flush)
     )
     )
    ; =====================================
    ; <toolbox> 是注册在主菜单的意思, 后面随意
    (script-fu-register "doooom-fractal-art"
      "<Toolbox>/Xtns/Script-Fu/Linuxsir/Fractal Art..."
      "Draw some fractal art blah blah"
      "doooom at linuxsir"
      "doooom"
      "June 2003"
      ""
      SF-VALUE "Canvas Width" "300"
      )
    --------------------------------------------------------------------------------
    执行的时候,在菜单选择 xtns 》 script-fu 》linuxsir 》fractal art,然后指定想要的图片宽度,还有就是指定好颜色和画笔,建议用小点的笔头哦。

    接着我们再看一个叫PS fans彻底FT的script ( 我可不是gimp卫道者哦,PS狠不错的,但是也狠贵,别说盗版,你试试在ebay上卖一个盗版PS7,保准送你去消声客监狱 )。
    gimp可以将每一个layer的图象作为gif或者video (mpeg1/2)的一桢来输出。这样我们可以使用gimp来制作mpg或者gif动画。mpg需要安装一些软件和script。这里说说做gif。
    下面是一个简单的脚本,说简单是我没有在里面加入复杂的动作(比较懒),只是做了一个圆周运动的东东。如果你喜欢你可以用脚本写出来,九大星星的运动轨道,或者xxxx,反正能编程了上么写不出呢?这里只是show一下script的潜力。
    还是一样在 xtns 》linuxsir 脚本anim,选择你要输出的文件和运动半径,指定好画笔和颜色。
     
    源码:--------------------------------------------------------------------------------
    ; 这个routine和前面画线的是一起ref来的.呵呵
    (define (script-setdot img xcoord ycoord)
     (set! thecoords (cons-array 4 'double))
     (aset thecoords 0 xcoord)
     (aset thecoords 1 ycoord)
     (gimp-paintbrush (car (gimp-image-active-drawable img))
     0 2 thecoords 0 0)
     )
    (define (doooom-little-anim r outfile)
     (let* ((image (car (gimp-image-new (* r 3) (* r 3) RGB))) (layer 0)
             (cx (* r 1.5))
      (cy (* r 1.5))
      (x 1) (y 1)
      (angularstep (/ (* 3.1415926 2) 30))
      (ang 0)
      )
     (gimp-display-new image)
    ; 好象没什么好说的了,这个是while循环,呵呵
     (while (< ang (* 3.14 2))
      (set! layer (car (gimp-layer-new image (* r 3) (* r 3)
                         RGB-IMAGE "foobar" 100 NORMAL-MODE)))
             (gimp-drawable-fill layer BG-IMAGE-FILL)
             (gimp-image-add-layer image layer 0)
      (set! x (+ cx (* r (sin ang))))
      (set! y (+ cy (* r (cos ang))))
      (script-setdot image x y)
      (set! ang (+ ang angularstep))
      )
     (gimp-convert-indexed image 1 0 256 0 0 "")
    ; 这个是转换成所有色图象, 只有这样才可以保存成gif
     (file-gif-save 1 image  (car (gimp-image-active-drawable image))
       outfile outfile TRUE 1 0 0)
    ; 里面第一个参数是run_mod 如果是0 的话, gimp会弹出窗口
    ; 1 不会弹出,按照你命令的设置直接执行了.
     (gimp-displays-flush)
     )
     )
    (script-fu-register "doooom-little-anim"
      "<Toolbox>/Xtns/Script-Fu/Linuxsir/Little Anim..."
      "compose a gif animation of a rolling point in circular track."
      "doooom at linuxsir"
      "doooom"
      "July 2003"
      ""
      SF-VALUE "Radius" "100"
      SF-STRING "Output File" "anim.gif"
      )
    --------------------------------------------------------------------------------
     
    finish