| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 28564 人关注过本帖, 2 人收藏
标题:[原创]绘制窗体的开发包-请用TC3.0编译
只看楼主 加入收藏
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏(2)
 问题点数:0 回复次数:243 
[原创]绘制窗体的开发包-请用TC3.0编译
MAs9bMmS.rar (30.96 KB) [原创]绘制窗体的开发包-请用TC3.0编译



暑假真是漫长,天气又那么热什么地方都不想去,不过也罢,在家里搞点开发也挺好的。。昨天用了一下午的时间开发了一个窗体包(不过还没完善,有兴趣的朋友可以自己继续开发一些组件),写着个程序的目的是为了以后做DOS软件有个良好的界面基础,当然我也很希望能和大家一起分享,希望大家给我跟多的建议;另一方面练习一下C++中类的实现,以及相关技术(以前一直做过关于类方面的程序,所以利用暑假,想多学习点新的技术)。

好了贴上源代码
/* iFile.h */
#ifndef __IFILE_H
#define __IFILE_H
#include "IFile.cpp"
#endif

/* iFile.cpp */
#define MAX_IMAGE_FILE 1000
class IFile
{
public:
    IFile();
    void get_region(int,int,int,int);
    void put_region(void);
    void clear(void);
    ~IFile();
private:
    char *imgPath;
};
IFile::IFile()
{
    imgPath=NULL;
}
void IFile::get_region(int x1,int y1,int x2,int y2)
{
    if(!imgPath)
    {
        char buf[MAXPATH]={'\0'};
        register int i,j,k;
        int pntColor=0;
        
        FILE *fp=NULL;
        for(i=0;i<MAX_IMAGE_FILE;i++)
        {
            sprintf(buf,"image%d.pge",i);
            fp=fopen(buf,"r");
            if(fp) continue;
            
            fclose(fp);
            fp=fopen(buf,"w");
            
            fwrite(&x1,sizeof(int),1,fp);
            fwrite(&y1,sizeof(int),1,fp);
            fwrite(&x2,sizeof(int),1,fp);
            fwrite(&y2,sizeof(int),1,fp);
            
            for(j=x1;j<=x2;j++)
            {
                for(k=y1;k<=y2;k++)
                {
                    pntColor=getpixel(j,k);
                    fwrite(&pntColor,sizeof(int),1,fp);
                }
            }
            fclose(fp);
            imgPath=(char *)malloc((strlen(buf)+1)*sizeof(char));
            if(!imgPath)
            {
                printf("Cannot allocate for string!\n");
                exit(1);
            }
            strcpy(imgPath,buf);
            break;   
        }
    }   
}
void IFile::put_region(void)
{
    if(imgPath)
    {
        FILE *fp=NULL;
        register int i,j;
        int x1=0,y1=0,x2=0,y2=0;
        int pntColor=0;
        
        fp=fopen(imgPath,"r");
        if(!fp)
        {
            free(imgPath);
            imgPath=NULL;
            return ;
        }
        
        fread(&x1,sizeof(int),1,fp);
        fread(&y1,sizeof(int),1,fp);
        fread(&x2,sizeof(int),1,fp);
        fread(&y2,sizeof(int),1,fp);
        
        for(i=x1;i<=x2;i++)
        {
            for(j=y1;j<=y2;j++)
            {
                fread(&pntColor,sizeof(int),1,fp);
                putpixel(i,j,pntColor);
            }
        }
        fclose(fp);
    }
}
void IFile::clear(void)
{
    if(imgPath)
    {
        FILE *fp=NULL;
        fp=fopen(imgPath,"r");
        if(!fp)
        {
            free(imgPath);              
            imgPath=NULL;
        }
        else
        {
            fclose(fp);
            unlink(imgPath);
            free(imgPath);
            imgPath=NULL;
        }
    }
}
void IFile::~IFile()
{
    clear();
}

/* 哦这里我说一下iFile类是用于存放被窗体遮盖的背景图,因为有时候是用imagesize函数获得的贴图超过64kb就不能分配内存了,真可惜,我就把贴图存入文件,该文件就最为这个软件的虚拟内存的页文件吧 */
搜索更多相关主题的帖子: 编译 窗体 源代码 绘制 
2005-07-17 11:11
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
/* MyGui.h */
#ifndef __MYGUI_H
#define __MYGUI_H
#include "MyGui.cpp"
extern void initGraphDrv(void);
extern void gettextcenterpos(int,int,int,int,char *,int *,int *) /* 这个自己加一下,这个我在写帖子的时候加的,呵呵不好意思 */
#endif

/* MyGui.cpp */
#define dx 1
#define dy 1
#define SCREEN_WIDTH  640
#define SCREEN_HEIGHT 480
#define MAX_BORDER_WIDTH         10
#define DEFAULT_REGION           50,50,550,400
#define DEFAULT_ANIMATION_DELAY  500
#define DEFAULT_BORDER_WIDTH     2
#define DEFAULT_FILL_STYLE       SOLID_FILL
#define DEFAULT_BC_UPPER         WHITE
#define DEFAULT_BC_LOWER         DARKGRAY
#define DEFAULT_BGCOLOR          LIGHTGRAY
#define DEFAULT_TITLE_BGCOLOR    BLUE
#define DEFAULT_TEXT_COLOR       WHITE
#define DEFAULT_TITLE_HEIGHT     20
#ifndef DATATYPE_BOOL
#define DATATYPE_BOOL
typedef enum {FALSE=0,TRUE} BOOL;
#endif
void initGraphDrv(void)
{
    /* request auto detection */
   int gdriver = DETECT, gmode, errorcode;
   /* initialize graphics mode */
   initgraph(&gdriver, &gmode, "");
   /* read result of initialization */
   errorcode = graphresult();
   if (errorcode != grOk)  /* an error occurred */
   {
      printf("Graphics error: %s\n", grapherrormsg(errorcode));
      printf("Press any key to halt:");
      getch();
      exit(1);             /* return with error code */
   }
}   
void gettextcenterpos(int bx,int by,int w,int h,char *text,int *x,int *y)
{
    *x=(w-textwidth(text))/2+bx;
    *y=(h-textheight(text))/2+by;
}
class Region
{
public:
    /* Construction */
    Region();
    Region(int,int,int,int);
    /* Member functions */
    BOOL create_region(int,int,int,int);
   
    int getleft(void);
    int gettop(void);
    int getright(void);
    int getbottom(void);
   
    void setleft(int);
    void settop(int);
    void setright(int);
    void setbottom(int);
   
protected:
    int left;
    int top;
    int right;
    int bottom;
};
class Rect : public Region
{
public:
    /* Construction */
    Rect();
    Rect(int,int,int,int);
    /* Member functions */
    BOOL adjust_region(int,int,int,int);
    BOOL set_border_width(int);
    BOOL set_border_colors(int,int);
    BOOL set_bgcolor(int);
    BOOL set_fill_style(int);
    BOOL set_animation_delay(int);
   
    int get_border_width(void);
   
    void paint(BOOL,BOOL);
    void animation(void);
private:
    int border_width;
    int border_color_upper;
    int border_color_lower;
    int bgcolor;
    int fs;
    int animation_delay;
};
class objWin
{
public:
    /* Construction */
    objWin();
    objWin(int,int,int,int);
   
    /* Settings for objWin */
    BOOL set_caption(char *);
    BOOL set_caption_color(int);
    BOOL set_body_colors(int,int,int);
    BOOL set_title_colors(int,int,int);
    BOOL set_body_border_width(int);
    BOOL set_title_border_width(int);
    BOOL set_body_fill_style(int);
    BOOL set_title_fill_style(int);
    /* ReadOnly properties */
    int getwidth(void);
    int getheight(void);
    char *getcaption(void);
    BOOL adjust_size(int,int);
    BOOL move(int,int);
    BOOL isVisible(void);
   
    /* Methods */
    void hide(void);
    void show(void);
    void paint(void);
   
    /* Events */
    virtual void onHide(void)   {};
    virtual void onShow(void)   {};
    virtual void onPaint(void)  {};
    virtual void onMove(void)   {};
    virtual void onAdjust(void) {};
   
    /* Destruction */
    ~objWin();
private:
    Rect body;
    Rect title;
    IFile image;
    char *caption;
    int caption_color;
    BOOL Visible;
};   
Region::Region()
{
    /* Initalizing variable table */
    left=100;
    top=100;
    right=300;
    bottom=300;
}
Region::Region(int x1,int y1,int x2,int y2)
{
    if(x1>=x2||y1>=y2||x1<=0||y1<=0||x2<=0||y2<=0)
    {
        left=100;
        top=100;
        right=300;
        bottom=300;
    }
    else   
    {
        left=x1;
        top=y1;
        right=x2;
        bottom=y2;
    }   
}
BOOL Region::create_region(int x1,int y1,int x2,int y2)
{
    if(x1>=x2||y1>=y2||x1<0||y1<0||x2<0||y2<0) return FALSE;
    left=x1;
    top=y1;
    right=x2;
    bottom=y2;
    return TRUE;
}   
int Region::getleft(void)
{
    return left;
}
int Region::gettop(void)
{
    return top;
}
int Region::getright(void)
{
    return right;
}
int Region::getbottom(void)
{
    return bottom;
}            
void Region::setleft(int value)
{
    if(value>=0&&value<SCREEN_WIDTH) left=value;
}
void Region::settop(int value)
{
    if(value>=0&&value<SCREEN_HEIGHT) top=value;
}
void Region::setright(int value)
{
    if(value>0&&value>left&&value<SCREEN_WIDTH) right=value;
}
void Region::setbottom(int value)
{
    if(value>0&&value>top&&value<SCREEN_HEIGHT) bottom=value;
}        
Rect::Rect()
{
    create_region(DEFAULT_REGION);
    border_width=DEFAULT_BORDER_WIDTH;
    border_color_upper=DEFAULT_BC_UPPER;
    border_color_lower=DEFAULT_BC_LOWER;
    bgcolor=DEFAULT_BGCOLOR;
    fs=DEFAULT_FILL_STYLE;
    animation_delay=DEFAULT_ANIMATION_DELAY;
}
Rect::Rect(int x1,int y1,int x2,int y2)
{
    if(!create_region(x1,y1,x2,y2)) create_region(DEFAULT_REGION);
    border_width=DEFAULT_BORDER_WIDTH;
    border_color_upper=DEFAULT_BC_UPPER;
    border_color_lower=DEFAULT_BC_LOWER;
    bgcolor=DEFAULT_BGCOLOR;
    fs=DEFAULT_FILL_STYLE;
    animation_delay=DEFAULT_ANIMATION_DELAY;
}
BOOL Rect::adjust_region(int x1,int y1,int x2,int y2)
{
    return create_region(x1,y1,x2,y2);
}
BOOL Rect::set_border_width(int bw)
{
     if(bw<=0||bw>MAX_BORDER_WIDTH) return FALSE;
     border_width=bw;
     return TRUE;
}
BOOL Rect::set_border_colors(int bc_upper,int bc_lower)
{
    if(bc_upper<0||bc_lower<0) return FALSE;
    border_color_upper=bc_upper;
    border_color_lower=bc_lower;
    return TRUE;
}
BOOL Rect::set_bgcolor(int bgc)
{
    if(bgc<0) return FALSE;
    bgcolor=bgc;
    return TRUE;
}
BOOL Rect::set_fill_style(int fstyle)
{
    if(fstyle<0) return FALSE;
    fs=fstyle;
    return TRUE;
}
BOOL Rect::set_animation_delay(int mi_second)
{
    if(mi_second<=0) return FALSE;
    animation_delay=mi_second;
    return TRUE;
}   
int Rect::get_border_width(void)
{
    return border_width;
}   
void Rect::paint(BOOL transparent,BOOL border_inverse)
{
    register int i;
    int bleft=left,btop=top,bright=right,bbottom=bottom;
    int bkpen_color=getcolor();
   
    for(i=0;i<border_width;i++)
    {
        if(!border_inverse) setcolor(border_color_upper);
        else setcolor(border_color_lower);
        
        line(bleft,btop,bleft,bbottom);
        line(bleft,btop,bright,btop);
        
        if(!border_inverse) setcolor(border_color_lower);
        else setcolor(border_color_upper);
        
        line(bright,btop,bright,bbottom);
        line(bleft,bbottom,bright,bbottom);
        bleft+=dx;
        bright-=dx;
        btop+=dy;
        bbottom-=dy;
    }
    if(!transparent)
    {
        setfillstyle(fs,bgcolor);
        bar(bleft,btop,bright,bbottom);
    }
    setcolor(bkpen_color);
}
void Rect::animation(void)
{
    paint(TRUE,TRUE);
    delay(animation_delay);
    paint(TRUE,FALSE);
}   
objWin::objWin()
{
    int x_redirect=body.get_border_width()*dx;
    int y_redirect=body.get_border_width()*dy;
   
    title.set_bgcolor(DEFAULT_TITLE_BGCOLOR);
    title.set_border_colors(DEFAULT_BC_LOWER,DEFAULT_BC_UPPER);
    title.set_border_width(1);
   
    title.adjust_region(body.getleft()+x_redirect+2*dx,body.gettop()+y_redirect+2*dy,
        body.getright()-x_redirect-2*dx,body.gettop()+y_redirect+2*dy+DEFAULT_TITLE_HEIGHT);
   
    caption=NULL;
    caption_color=DEFAULT_TEXT_COLOR;
    Visible=FALSE;
}
objWin::objWin(int x1,int y1,int x2,int y2)
{
    int x_redirect=body.get_border_width()*dx;
    int y_redirect=body.get_border_width()*dy;
    body.adjust_region(x1,y1,x2,y2);
    title.set_bgcolor(DEFAULT_TITLE_BGCOLOR);
    title.set_border_colors(DEFAULT_BC_LOWER,DEFAULT_BC_UPPER);
    title.set_border_width(1);
   
    title.adjust_region(body.getleft()+x_redirect+2*dx,body.gettop()+y_redirect+2*dy,
        body.getright()-x_redirect-2*dx,body.gettop()+y_redirect+2*dy+DEFAULT_TITLE_HEIGHT);
    caption=NULL;
    caption_color=DEFAULT_TEXT_COLOR;
    Visible=FALSE;
}
BOOL objWin::set_caption(char *s)
{
    if(s)
    {
        if(caption)
        {
            free(caption);
            caption=NULL;
        }
            
        caption=(char *)malloc((strlen(s)+1)*sizeof(char));
        if(!caption)
        {
            printf("Cannot allocate memory for string!\n");
            exit(1);
        }
        strcpy(caption,s);
            
        return TRUE;
    }
    return FALSE;   
}
BOOL objWin::set_caption_color(int c)
{
    if(c<0) return FALSE;
    caption_color=c;
    return TRUE;
}
BOOL objWin::set_body_colors(int bbc_upper,int bbc_lower,int bbgcolor)
{
    if(bbc_upper<0||bbc_lower<0||bbgcolor<0) return FALSE;
    body.set_border_colors(bbc_upper,bbc_lower);
    body.set_bgcolor(bbgcolor);
    return TRUE;
}
BOOL objWin::set_title_colors(int tbc_upper,int tbc_lower,int tbgcolor)
{
    if(tbc_upper<0||tbc_lower<0||tbgcolor<0) return FALSE;
    title.set_border_colors(tbc_upper,tbc_lower);
    title.set_bgcolor(tbgcolor);
    return FALSE;
}
BOOL objWin::set_body_border_width(int bbw)
{
    if(bbw<=0||bbw>MAX_BORDER_WIDTH) return FALSE;
    body.set_border_width(bbw);
    return TRUE;
}
BOOL objWin::set_title_border_width(int tbw)
{
    if(tbw<=0||tbw>MAX_BORDER_WIDTH) return FALSE;
    title.set_border_width(tbw);
    return TRUE;
}        
BOOL objWin::set_body_fill_style(int bfs)
{
    if(bfs<0) return FALSE;
    body.set_fill_style(bfs);
    return TRUE;
}
BOOL objWin::set_title_fill_style(int tfs)
{
    if(tfs<0) return FALSE;
    title.set_fill_style(tfs);
    return TRUE;
}
char *objWin::getcaption(void)
{
    return caption;
}
int objWin::getwidth(void)
{
    return body.getright()-body.getleft();
}
int objWin::getheight(void)
{
    return body.getbottom()-body.gettop();
}
BOOL objWin::isVisible(void)
{
    return Visible;
}
BOOL objWin::adjust_size(int w,int h)
{
    int x_redirect=body.get_border_width()*dx;
    int y_redirect=body.get_border_width()*dy;
    if(w-body.getleft()>SCREEN_WIDTH||w-body.getleft()<0||h-body.gettop()>SCREEN_HEIGHT||h-body.gettop()<0)
        return FALSE;
    body.setright(w-body.getleft());
    body.setbottom(h-body.gettop());
   
    title.adjust_region(body.getleft()+x_redirect+2*dx,body.gettop()+y_redirect+2*dy,
        body.getright()-x_redirect-2*dx,body.gettop()+y_redirect+2*dy+DEFAULT_TITLE_HEIGHT);
   
    if(Visible)
    {
        image.put_region();
        Visible=FALSE;
        paint();
    }   
   
    onAdjust();
    return TRUE;
}   
BOOL objWin::move(int x,int y)
{
    int x_redirect=body.get_border_width()*dx;
    int y_redirect=body.get_border_width()*dy;
   
    if(x>SCREEN_WIDTH||x<0||y>SCREEN_HEIGHT||y<0) return FALSE;
    if(getwidth()-x>SCREEN_WIDTH||getwidth()-x<0||getheight()-y>SCREEN_HEIGHT||getheight()-y<0)
        return FALSE;
    body.setleft(x);
    body.setright(y);
   
    title.adjust_region(body.getleft()+x_redirect+2*dx,body.gettop()+y_redirect+2*dy,
        body.getright()-x_redirect-2*dx,body.gettop()+y_redirect+2*dy+DEFAULT_TITLE_HEIGHT);
   
    if(Visible)
    {
        image.put_region();
        Visible=FALSE;
        paint();
    }
   
    onMove();
    return TRUE;
}        
void objWin::paint(void)
{
    if(!Visible)
    {
        int textx=0,texty=0;
        int tw=title.getright()-title.getleft(),th=title.getbottom()-title.gettop();
        int bkpen_color=getcolor();
        
        image.clear();
        image.get_region(body.getleft(),body.gettop(),body.getright(),body.getbottom());  
        
        body.paint(FALSE,FALSE);
        title.paint(FALSE,FALSE);
        
        gettextcenterpos(title.getleft(),title.gettop(),tw,th,caption,&textx,&texty);
        setcolor(caption_color);
        outtextxy(textx,texty,caption);
        setcolor(bkpen_color);
        
        onPaint();
        Visible=TRUE;
    }
}      
void objWin::hide(void)
{
    if(Visible)
    {
        image.put_region();
        Visible=FALSE;
        onHide();
    }
}
void objWin::show(void)
{
    if(!Visible)
    {
        paint();
        onShow();
    }
}
objWin::~objWin()
{
    if(caption)
    {
        free(caption);
        caption=NULL;
    }
}

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-07-17 11:14
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
/* debug.cpp 这个是测试程序,里面为大家演示如何使用图形包 */

#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <conio.h>
#include <graphics.h>
#include <string.h>
#include <dir.h>
#include "IFile.h"
#include "MyGui.h"
void brush(void)
{
    setfillstyle(SOLID_FILL,BLACK);
    bar(0,460,639,479);
}
   
class MyDlg : public objWin
{
public:
    MyDlg();
    void onHide(void);
    void onShow(void);
    void onPaint(void);
    void onMove(void);
    void onAdjust(void);
};
MyDlg::MyDlg()
{
    objWin();
    set_caption("Hello,World!");
    paint();
}   
void MyDlg::onHide(void)
{
    brush();
    outtextxy(0,460,"onHide event executed!");
}
void MyDlg::onShow(void)
{
    brush();
    outtextxy(0,460,"onShow event executed!");
}
void MyDlg::onPaint(void)
{
    brush();
    outtextxy(0,460,"onPaint event executed!");
}
void MyDlg::onMove(void)
{
    brush();
    outtextxy(0,460,"onMove event executed!");
}
void MyDlg::onAdjust(void)
{
    brush();
    outtextxy(0,460,"onAdjust event executed!");
}
int main()
{
    initGraphDrv();
    MyDlg dlg;
    getch();
    dlg.hide();
    getch();
    dlg.show();
    getch();
    dlg.adjust_size(dlg.getwidth()-100,dlg.getheight()-100);
    getch();
    dlg.move(10,10);
    getch();
    closegraph();
}                        

/* 对了,这里我要说明一下,大家在使用图形包的时候,请不要直接使用objWin声明一个类,objWin我是将其视为窗体的基类看待,因为其中包含没有实装的纯虚函数,请根据自己的需要写一个继承类,我在debug.cpp有个范例,大家可以模仿。。。 */

当然有不足之处请各位大虾不吝赐教谢谢啦,同时祝愿和我一样的学生朋友暑假快乐,收获多多。。。

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-07-17 11:17
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
修正一个移动时的BUG,请大家编辑MyGui.cpp的objWin::move(int x,int y)函数,其中你可以发现在这个函数体中调用了body.setleft()和body.setright()这两个函数,请用一下代码替换掉这两个函数的调用:
body.setright(getwidth()-x);
body.setbottom(getheight()-y);
body.setleft(x);
body.settop(y);

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-07-17 11:31
牛虻
Rank: 1
等 级:新手上路
威 望:1
帖 子:472
专家分:0
注 册:2004-10-1
收藏
得分:0 
支持一下咯

土冒
2005-07-17 12:00
georgezf
Rank: 1
等 级:新手上路
帖 子:275
专家分:0
注 册:2004-11-20
收藏
得分:0 
这个是C++的吗?

2005-07-17 14:14
ajey2004
Rank: 1
等 级:新手上路
帖 子:164
专家分:0
注 册:2004-12-30
收藏
得分:0 
呵呵看来是好东西啊

2005-07-17 14:57
xwjlyj
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2005-7-17
收藏
得分:0 
dddddddddddd
2005-07-17 19:16
天空之城
Rank: 1
等 级:新手上路
帖 子:54
专家分:0
注 册:2005-6-25
收藏
得分:0 
+++

天空之城...
2005-07-19 22:50
sbsbsbsb8888
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2005-7-19
收藏
得分:0 
please
answer
2005-07-20 00:26
快速回复:[原创]绘制窗体的开发包-请用TC3.0编译
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020490 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved