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