C_GUI編程入門
第一章:認(rèn)識GUI編程
在程序設(shè)計(jì)中,往往我們最后編譯的結(jié)果都是通過控制臺輸出所獲得的一系列數(shù)據(jù),隨著科技一天天的進(jìn)步,人們對程序的美觀的要求也逐漸加深,所以漸漸的,圖型顯示就變的比較重要了。顯示器的顯示方式有文本方式和圖形方式兩種,這里講述文本方式下屏幕輸出的控制,并介紹一些有關(guān)屏幕處理的函數(shù)。本文所介紹函數(shù)均包含于conio.h這個(gè)頭文件當(dāng)中,因此在用戶程序中使用這些函數(shù)時(shí),必須用include將conio.h包含在程序中。
第二章:初識GUI應(yīng)用函數(shù)
1.文本方式控制函數(shù)Void textmode(int newmode);
這里的參數(shù)newmode既可以是下表中的方式代碼,也可以是大寫的方式名。
方式 | 方式名 | 顯示列*行數(shù)和顏色 |
0 | BW40 | 40*25黑白顯示 |
1 | C40 | 40*25彩色顯示 |
2 | BW80 | 80*25黑白顯示 |
3 | C80 | 80*25彩色顯示 |
7 | MONO | 80*25單色顯示 |
-1 | LASTMODE | 上一次的顯示方式 |
一般建議使用C80或者C40的顯示方式。LASTMODE方式指上一次設(shè)置的文本顯示方式,它常用于在圖形方式到文本方式的切換。
2.文本方式顏色控制函數(shù)
a.文本屬性設(shè)置函數(shù)Void textattr(int attr);
該函數(shù)設(shè)置文本顯示的屬性,包括字符顯示顏色(前景色),背景色及字符顯示是否閃爍等,其參數(shù)可以用一個(gè)字節(jié),即8位數(shù)來描述,各位含義如下表。
閃爍 | 紅 | 綠 | 藍(lán) | 加亮 | 紅 | 綠 | 藍(lán) |
BLINK | R | G | B | I | R | G | B |
閃爍 | 背景色 | 前景色 |
其中低四位用來設(shè)置字符顯示顏色(對應(yīng)顏色值0~15),4~6為用來設(shè)置顯示背景色(對應(yīng)顏色值0~7),第七位最高,用來顯示的字符是否閃爍。
例:藍(lán)底紅字 textattr(RED+(BLUE<<4));
白底藍(lán)字(閃)textattr((WHITE<<4)+BLUE_BLINK);
或(方式值) textattr(128+1+(15<<4));
或(十六進(jìn)制) textattr(0xf1);
顏色表
顏色名 | 值 | 顯示色 | 用處 |
BLACK | 0 | 黑 | 前景,背景色 |
BLUE | 1 | 藍(lán) | 前景,背景色 |
GREEN | 2 | 綠 | 前景,背景色 |
CYAN | 3 | 青 | 前景,背景色 |
RED | 4 | 紅 | 前景,背景色 |
MAGENTA | 5 | 洋紅 | 前景,背景色 |
BROWN | 6 | 棕 | 前景,背景色 |
LIGHTGRAY | 7 | 淺灰 | 用于前景色 |
DARKGRAY | 8 | 深灰 | 用于前景色 |
LIGHTBLUE | 9 | 淡藍(lán) | 用于前景色 |
LIGHTGREEN | 10 | 淺綠 | 用于前景色 |
LIGHTCYAN | 11 | 淡青 | 用于前景色 |
LIGHTRED | 12 | 淡紅 | 用于前景色 |
LIGHTMAGENTA | 13 | 淡洋紅 | 用于前景色 |
YELLOW | 14 | 黃 | 用于前景色 |
WHITE | 15 | 白 | 用于前景色 |
BLINK | 128 | 閃爍 | 用于前景色 |
b.文本字符顏色設(shè)置函數(shù)void textcolor(int color);
該函數(shù)設(shè)置文本字符顏色,即是前景色,只能在彩色顯示的模式下才可進(jìn)行。參數(shù)可以是方式值也可以是大寫的方式名(按顏色表為準(zhǔn))。
c.文本背景色設(shè)置函數(shù)void textbackfround(int color);
該函數(shù)設(shè)置文本背景色,只能在彩色顯示的模式下才可進(jìn)行。參數(shù)可以是方式值也可以是大寫的方式名(只能是顏色表前八種顏色)。
d.高亮度顯示字符void highvideo(void);
e.低亮度顯示字符void lowvideo(void);
f.通常亮度顯示字符void normvideo(void);
3.窗口設(shè)置和文本輸出函數(shù)
a.窗口設(shè)置函數(shù)void window(int x1,int y1,int x2,int y2);
其中(x1,y1)為窗口左上角坐標(biāo),(x2,y2)為窗口右下角坐標(biāo),這些坐標(biāo)以整個(gè)屏幕為參考系。當(dāng)定義窗口時(shí),若定義坐標(biāo)超過屏幕坐標(biāo)界限(即顯示模式的界限),則該窗口不會(huì)建立。
利用窗口函數(shù)可以在屏幕上定義多個(gè)不同的窗口,以顯示不同的信息。定義一個(gè)窗口后,前面所講過的函數(shù)textattr,textcolor和textbackground僅對此窗口起作用,窗口以外不受影響。當(dāng)定義多個(gè)窗口后,上文中函數(shù)的作用域僅為最后一個(gè)定義的窗口。
b.控制臺文本輸出函數(shù)
int cprintf(char *format,…);
int cputs(char *str);
int cputch(int ch);
這三個(gè)輸出函數(shù)不同于標(biāo)準(zhǔn)輸出函數(shù)printf之類,它們受窗口的控制,窗口內(nèi)顯示的光標(biāo)就是他們開始的位置,當(dāng)輸出行右邊超過窗口的左邊界時(shí),自動(dòng)移動(dòng)到窗口內(nèi)下一行開始輸出,當(dāng)輸出到窗口底部邊界時(shí),窗口內(nèi)的內(nèi)容將自動(dòng)上卷(類似于翻頁),直至輸出完為止。
4.清屏和光標(biāo)操作函數(shù)
a.清屏函數(shù)
void clrscr(void);清除窗口中文本
void clreol(void);清除當(dāng)前窗口中從光標(biāo)開始位置到本行結(jié)尾的所有字符(但不改變光標(biāo)位置)
void delline(void);清除光標(biāo)所在那一行字符
b.光標(biāo)操作函數(shù)
void gotoxy(int x,int y);
該函數(shù)把光標(biāo)移動(dòng)到窗口內(nèi)的(x,y)處,x,y坐標(biāo)是相對于窗口而言,它多和cprintf函數(shù)配合,以指定輸出開始位置。
5.屏幕文本移動(dòng)與存儲(chǔ)函數(shù)
a.屏幕文本移動(dòng)函數(shù)void movetext(int x1,inty1,int x2,int y2,int x3,int y3);
該函數(shù)是將坐標(biāo)起始為(x1,y1)終止為(x2,y2)的矩形方塊內(nèi)文本拷貝到左上角坐標(biāo)為(x3,y3)的新矩形框內(nèi),這里x,y的坐標(biāo)是以整個(gè)屏幕為窗口坐標(biāo)系,該函數(shù)與開設(shè)的窗口無關(guān),且原來矩形區(qū)文本不變。
b屏幕文本存儲(chǔ)函數(shù)void gettext(int x1,int y1,int x2,int y2,void *buffer);
該函數(shù)是將坐標(biāo)起始為(x1,y1)終止為(x2,y2)的矩形方塊內(nèi)文本拷貝到由buffer指針指向的一個(gè)內(nèi)存緩沖區(qū)內(nèi)。這個(gè)緩沖區(qū)大小可以計(jì)算,由于在屏幕上顯示的一個(gè)字符占兩個(gè)字節(jié)(一個(gè)是字符本身的ASCII碼,第二個(gè)字節(jié)是屬性字節(jié),表示其顯示的前景色,背景色以及是否閃爍等)
緩沖取字節(jié)總數(shù)=矩形內(nèi)行數(shù)*每行列數(shù)*2
c.屏幕文本取出函數(shù)void puttext(int x1,int y1,int x2,int y2,void *buffer);
該函數(shù)是將把buffer指針指向的緩沖區(qū)內(nèi)所存文本復(fù)制到屏幕上以坐標(biāo)起始為(x1,y1)終止為(x2,y2)的矩形方塊內(nèi)。
6.狀態(tài)查詢函數(shù)
a.屏幕文本顯示有關(guān)信息的函數(shù)
void gettextinfo(struct texy_info *f);
這里的text_info是在conio.h頭文件中定義的一個(gè)結(jié)構(gòu),該結(jié)構(gòu)的定義是
Struct text_info
{
unsigned char winleft; /*窗口左上角x坐標(biāo)*/
unsigned char wintop; /*窗口左上角y坐標(biāo)*/
unsigned char winright;/*窗口右下角x坐標(biāo)*/
unsigned char winbottom;/*窗口左下角x坐標(biāo)*/
unsigned char attributes; /*文本屬性*/
unsigned char normattr;/*通常屬性*/
unsigned char currmode; /*當(dāng)前文本方式*/
unsigned char screenheight; /*屏高*/
unsigned char screenwidth; /*屏寬*/
unsigned char curx;/*當(dāng)前光標(biāo)的x值*/
unsigned char curyt; /*當(dāng)前光標(biāo)的y值*/
b.當(dāng)前光標(biāo)位置的函數(shù)
int wherex(void);
int wherey(void);
通過這兩個(gè)函數(shù)可分別得到當(dāng)前窗口中光標(biāo)的x和y坐標(biāo)
第三章:實(shí)例分析
文本下拉框設(shè)計(jì)
Code:
/*學(xué)生用戶信息窗體坐標(biāo)*/
#defineX120
#defineY12
#defineX1_LENTH10
/*這里可以通過修改坐標(biāo)來實(shí)現(xiàn)彈出的窗口的位置變化,如當(dāng)前,即框是畫在(20.2)的位置上,框長10個(gè)字符,寬2個(gè)字符。*/
#defineY1_LENTH1
/*學(xué)生用戶信息函數(shù)*/
intinformation_file()
{
intkey_BOARD,y,x,x1_lenth;
window(X1,Y1,(X1+X1_LENTH),(Y1+Y1_LENTH));
textbackground(LIGHTGRAY);
clrscr();
textcolor(WHITE);//背景色設(shè)為淺灰色,前景色白色,輸出兩個(gè)選項(xiàng):1.Editor,2.Back
cprintf("1.Editor/r/n");
cprintf("2.Back");
x=X1;
y=Y1;
x1_lenth=X1_LENTH;
nowbar_file(x,y,x1_lenth);
gotoxy(1,1);
for(;key_BOARD!=KEY_ENTER;)//進(jìn)入一個(gè)以ENTER鍵為退出的FOR循環(huán)當(dāng)中,CASE-DOWN是鍵盤的下移鍵,CASE-UP是鍵盤的上 移鍵,通過BAR函數(shù)的調(diào)用來實(shí)現(xiàn)光標(biāo)的顯示。
{
key_BOARD=key();
switch(key_BOARD){
caseKEY_DOWN:{
++y;
if(y==(Y1+Y1_LENTH+1))y=Y1;
nowbar_file(x,y,x1_lenth);
if(y!=Y1)nowbardown_file(x,y,x1_lenth);
elsenowbardown_file(x,Y1+Y1_LENTH+1,x1_lenth);
gotoxy(1,(y-Y1+1));
break;
}
caseKEY_UP:{
--y;
if(y==(Y1-1))y=Y1+Y1_LENTH;
nowbar_file(x,y,x1_lenth);
if(y!=(Y1+Y1_LENTH))nowbarup_file(x,y,x1_lenth);
elsenowbarup_file(x,Y1-1,x1_lenth);
gotoxy(1,(y-Y1+1));
break;
}
}
}
returny;
}
/*登陸函數(shù)*/
voidnowbar(inty)
{
inti;
typedefstructtextl_struct
{
unsignedcharch;
unsignedcharattr;
}
texel;
texelt;
for(i=36;i<=46;i++) ??
{
gettext(i,y,i,y,&t);
t.attr=(BLUE<<4)+WHITE; ??
puttext(i,y,i,y,&t);
}
return;
}
voidnowbardown(inty)
{
inti;
typedefstructtextl_struct
{
unsignedcharch;
unsignedcharattr;
}
texel;
texelt;
y--;
for(i=36;i<=46;i++) ????
{
gettext(i,y,i,y,&t);
t.attr=(RED<<4)+WHITE; ????
puttext(i,y,i,y,&t);
}
return;
}
voidnowbarup(inty)
{
inti;
typedefstructtextl_struct
{
unsignedcharch;
unsignedcharattr;
}
texel;
texelt;
y++;
for(i=36;i<=46;i++) ??
{
gettext(i,y,i,y,&t);
t.attr=(RED<<4)+WHITE; ???
puttext(i,y,i,y,&t);
}
return;
}
責(zé)任編輯:haq
-
編程
+關(guān)注
關(guān)注
88文章
3683瀏覽量
94885 -
圖形
+關(guān)注
關(guān)注
0文章
72瀏覽量
19578
原文標(biāo)題:經(jīng)典圖形化編程例程介紹-CGUI編程后續(xù)例程直接可以使用
文章出處:【微信號:KY_QRS,微信公眾號:開源嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
詳解RTOS中的Hook函數(shù)
解鎖TSMaster fifo函數(shù):報(bào)文讀取的高效方法

西門子TIA Portal中函數(shù)FC和函數(shù)塊FB的相互轉(zhuǎn)換

常用SQL函數(shù)及其用法
如何優(yōu)化SUMIF函數(shù)的效率
SUMIF函數(shù)對比VLOOKUP的優(yōu)勢
SUMIF函數(shù)與SUMIFS函數(shù)的區(qū)別
SUMIF函數(shù)使用教程
如何由系統(tǒng)函數(shù)求頻率響應(yīng)
什么叫系統(tǒng)的頻率響應(yīng)函數(shù)?它和傳遞函數(shù)有何關(guān)系
面試常考+1:函數(shù)指針與指針函數(shù)、數(shù)組指針與指針數(shù)組

評論