11 製作視窗

2021-07-09 07:42:40 字數 4396 閱讀 4380

顯示視窗和繪製滑鼠的原理一樣

bootpack.c節選

void make_window8(unsigned

char *buf, int xsize, int ysize, char *title)

; int x, y;

char c;

boxfill8(buf, xsize, col8_c6c6c6, 0, 0, xsize - 1, 0 );

boxfill8(buf, xsize, col8_ffffff, 1, 1, xsize - 2, 1 );

boxfill8(buf, xsize, col8_c6c6c6, 0, 0, 0, ysize - 1);

boxfill8(buf, xsize, col8_ffffff, 1, 1, 1, ysize - 2);

boxfill8(buf, xsize, col8_848484, xsize - 2, 1, xsize - 2, ysize - 2);

boxfill8(buf, xsize, col8_000000, xsize - 1, 0, xsize - 1, ysize - 1);

boxfill8(buf, xsize, col8_c6c6c6, 2, 2, xsize - 3, ysize - 3);

boxfill8(buf, xsize, col8_000084, 3, 3, xsize - 4, 20 );

boxfill8(buf, xsize, col8_848484, 1, ysize - 2, xsize - 2, ysize - 2);

boxfill8(buf, xsize, col8_000000, 0, ysize - 1, xsize - 1, ysize - 1);

putfonts8_asc(buf, xsize, 24, 4, col8_ffffff, title); //顯示標題

for (y = 0; y < 14; y++)

}return;

}

bootpack.c中的主函式節選

unsigned

int memtotal, count = 0;

struct sheet *sht_back, *sht_mouse, *sht_win;

unsigned

char *buf_back, buf_mouse[256], *buf_win;

sht_win = sheet_alloc(shtctl);

buf_win = (unsigned

char *) memman_alloc_4k(memman, 160 * 52);

sheet_setbuf(sht_win, buf_win, 160, 52, -1); /* 沒有透明色 */

make_window8(buf_win, 160, 52, "counter");

sheet_slide(sht_sht_win, 80, 72);

sheet_updown(sht_back, 0);

sheet_updown(sht_win, 1);

sheet_updown(sht_mouse, 2);

for (;;)

;

sheet.c節選

//初始化圖層

struct

shtctl *shtctl_init(struct memman *memman, unsigned char *vram, int xsize, int ysize)

ctl->vram = vram; //vram位址

ctl->xsize = xsize; //vram大小

ctl->ysize = ysize;

ctl->top = -1; /* 乙個sheet也沒有 */

for (i = 0; i < max_sheets; i++)

err:

return ctl;

}//類似於sheet_refreshsub,只是用色號代替了圖層號

void sheet_refreshmap(struct shtctl *ctl, int vx0, int vy0, int vx1, int vy1, int h0)

if (vy0 < 0)

if (vx1 > ctl->xsize)

if (vy1 > ctl->ysize)

for (h = h0; h <= ctl->top; h++)

if (by0 < 0)

if (bx1 > sht->bxsize)

if (by1 > sht->bysize)

for (by = by0; by < by1; by++) }}

return;

}//從下到上重繪所有圖層,最後最上面的內容就留在了畫面上

//提高疊加處理速度:只重新整理移動前後的部分,而不是整個螢幕,避免每次都對全部vram重新填畫素

//因為會按照map對vram寫入,所以不必要從下面一直重新整理到最上面一層,所以指定h0, h1.

void sheet_refreshsub(struct shtctl *ctl, int vx0, int vy0, int vx1, int vy1, int h0, int h1)

if (vy0 < 0)

if (vx1 > ctl->xsize)

if (vy1 > ctl->ysize)

for (h = h0; h <= h1; h++)

if (by0 < 0)

if (bx1 > sht->bxsize)

if (by1 > sht->bysize)

for (by = by0; by < by1; by++) }}

return;

}//接著修改呼叫sheet_refreshsub的函式

//不直接指定畫面中的座標,而是以緩衝區的座標來表示

//需要重新整理的圖層只有1張

void sheet_refresh(struct sheet *sht, int bx0, int by0, int bx1, int by1)

//設定圖層高度

void sheet_updown(struct sheet *sht, int height)

ctl->sheets[height] = sht;

sheet_refreshmap(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height + 1);

sheet_refreshsub(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height + 1, old);

} else /* 隱藏 */

}ctl->top--; /* 由於顯示中的圖層減少了乙個,所以最上面的圖層高度下降 */

sheet_refreshmap(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, 0);

sheet_refreshsub(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, 0, old - 1);}}

else

if (old < height) /* 比以前高 */

ctl->sheets[height] = sht;

} else

ctl->sheets[height] = sht;

ctl->top++; /* 由於已顯示的圖層增加了1個,所以最上面的圖層高度增加 */

} /* 按新圖層資訊重新繪製畫面 */

sheet_refreshmap(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height);

sheet_refreshsub(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height, height);

}return;

}//移**層

void sheet_slide(struct sheet *sht, int vx0, int vy0)

return;

}

VS 視窗製作

窗體 一 控制標題欄 text 窗體左上角的標題文字。icon 窗體左上角的圖示。如何做圖示?1.找現成的。2.自己畫。3.用轉 maximizebox 窗體右上角最大化框是否可用。minimizebox 窗體右上角最小化框是否可用。二 控制邊框 formborderstyle 窗體的邊框樣式。si...

浮動的視窗製作

step1 建立乙個對話方塊資源 step2 設定對話方塊的屬性 style child border none step3 建立該資源對應的類,基類為cdialogbar step4 在主框架中宣告該對話方塊中的乙個例項 step5 if dockdlg1.create this,idd dial...

QT 製作視窗圓角

一 設定視窗屬性 setwindowflags qt framelesswindowhint qt windowsystemmenuhint qt windowminmaxbuttonshint setattribute qt wa translucentbackground 二 使用qss新增圓角...