顯示視窗和繪製滑鼠的原理一樣
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新增圓角...