“漂亮”實(shí)用的C語(yǔ)言計(jì)算器(1)-外形構(gòu)造


我之前寫過(guò)一篇文章是介紹easyx圖形界面庫(kù)的,這里我再介紹一位大神寫的一個(gè)功能強(qiáng)大的計(jì)算器片择,我只把基本計(jì)算的功能濃縮過(guò)來(lái)給大家看看,感興趣的小伙伴可以去分析下全部的源碼
原始地址在這里:
https://codebus.cn/contributor/a/erlingeryi-calc
我們先來(lái)看下精簡(jiǎn)后的效果:

我們接下來(lái)通過(guò)分解來(lái)看下整個(gè)計(jì)算器的實(shí)現(xiàn)過(guò)程

第一步:先顯示個(gè)400*600像素的窗口


顯示窗口實(shí)現(xiàn)代碼:

#include <graphics.h>

typedef TCHAR T;

int main()
{
    // 創(chuàng)建繪圖窗口
    initgraph(400, 600);
    SetWindowText(GetHWnd(), _T("計(jì)算器"));
    while (true)
    {
        Sleep(20);
    }
    return 0;
}

第二步:在400*600的窗口畫出計(jì)算器的按鈕方格


顯示計(jì)算器的背景和主題按鈕代碼:

// 編譯環(huán)境:Visual C++ 6.0骚揍,EasyX 20190314(beta)
// http://www.easyx.cn
//
#include <graphics.h>


#define MyChar TCHAR

typedef TCHAR T;

void showscreen();
IMAGE  setimage(int wigth, int height, COLORREF rgb);
void copy_img(IMAGE* img1, IMAGE* img2);
void my_putimage(int dstX, int dstY, IMAGE *pimg, int avoid_color, int deviation, double light, int tp, int effect);

bool button[20][20] = { false };                                   // 屏幕按鍵標(biāo)志


int main()
{
    // 創(chuàng)建繪圖窗口
    initgraph(400, 600);
    SetWindowText(GetHWnd(), _T("計(jì)算器"));
    while (true)
    {
        showscreen();
        Sleep(20);
    }
    return 0;
}

void showscreen()
{
    BeginBatchDraw();


    IMAGE black = setimage(400, 600, RGB(255, 125, 0));             // 設(shè)置繪圖,計(jì)算器的主背景色R=255,G=125,B=0
    my_putimage(0, 0, &black, RGB(255, 255, 255), 0, 1, 30, 0);

    black = setimage(100, 50, RGB(0, 0, 0));    // 設(shè)置繪圖字管,按鈕的顏色為黑色

    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            if (j >= 1 && j < 4 && i <= 2 || j == 0 && i == 1)
            {
                if (!button[i][j])
                    my_putimage(i * 102, 340 + j * 52, &black, RGB(255, 255, 255), 0, 1, 90, 0);
                else
                    my_putimage(i * 102, 340 + j * 52, &black, RGB(255, 255, 255), 0, 1, 50, 0);
            }
            else
            {
                if (!button[i][j])
                    my_putimage(i * 102, 340 + j * 52, &black, RGB(255, 255, 255), 0, 1, 80, 0);
                else
                {
                    if (i == 3 && j == 4 || j == 0 && i == 2 || j == 0 && i == 0)
                    {
                        IMAGE black = setimage(100, 50, RGB(240, 0, 0));    // 設(shè)置繪圖
                        my_putimage(i * 102, 340 + j * 52, &black, RGB(255, 255, 255), 0, 1, 50, 0);
                    }
                    else if (j == 4 && i == 0 || j == 4 && i == 2 || j <= 4 && j >= 0 && i == 3)
                    {
                        IMAGE green = setimage(100, 50, GREEN); // 設(shè)置繪圖
                        my_putimage(i * 102, 340 + j * 52, &green, RGB(255, 255, 255), 0, 1, 60, 0);
                    }
                    else
                    {
                        IMAGE black = setimage(100, 50, RGB(225, 100, 26)); // 設(shè)置繪圖
                        my_putimage(i * 102, 340 + j * 52, &black, RGB(255, 255, 255), 0, 1, 50, 0);
                    }
                }
            }
        }
    }

    EndBatchDraw();
}


IMAGE  setimage(int wigth, int height, COLORREF rgb)
{
    IMAGE blacks(wigth, height);    // 創(chuàng)建 img 對(duì)象

    SetWorkingImage(&blacks);       // 設(shè)置繪圖目標(biāo)為 img 對(duì)象
    setfillcolor(rgb);
    solidrectangle(0, 0, wigth, height);

    SetWorkingImage();              // 設(shè)置繪圖目標(biāo)為繪圖窗口

    return blacks;
}

// copy img2 to img1
void copy_img(IMAGE* img1, IMAGE* img2)
{
    IMAGE* now_working = GetWorkingImage();
    Resize(img1, img2->getwidth(), img2->getheight());
    SetWorkingImage(img2);
    getimage(img1, 0, 0, img1->getwidth(), img1->getheight());
    SetWorkingImage(now_working);
}

void my_putimage(int dstX, int dstY, IMAGE *pimg, int avoid_color, int deviation, double light, int tp, int effect)
{
    int x, y, num;
    int R, G, B;            // 記錄貼圖某點(diǎn)色彩
    // 記錄排除顏色色彩
    int avoid_r = GetRValue(avoid_color);
    int avoid_g = GetGValue(avoid_color);
    int avoid_b = GetBValue(avoid_color);
    IMAGE pSrcImg;          // 背景圖
    IMAGE tempimg;          // 臨時(shí)貼圖
    copy_img(&tempimg, pimg);
    SetWorkingImage(NULL);  // 對(duì)默認(rèn)繪圖窗口的繪圖操作
    getimage(&pSrcImg, dstX, dstY, pimg->getwidth(), pimg->getheight());

    // 透明度容錯(cuò)
    if (tp < 0)tp = 0;
    else if (tp > 100)tp = 100;

    // 獲取背景指向顯存的指針
    DWORD* bk_pMem = GetImageBuffer(&pSrcImg);

    // 貼圖指向顯存的指針
    DWORD* pMem = GetImageBuffer(&tempimg);
    for (y = 0; y < pimg->getheight(); y++)
    {
        for (x = 0; x < pimg->getwidth(); x++)
        {
            num = y * pimg->getwidth() + x;
            R = GetRValue(pMem[num]);
            G = GetGValue(pMem[num]);
            B = GetBValue(pMem[num]);
            if ((abs(R - avoid_r) <= deviation) && (abs(G - avoid_g) <= deviation) && (abs(B - avoid_b) <= deviation))
            {
                pMem[num] = bk_pMem[num];
            }
            else
            {
                if (light > 0 && light < 1)
                {
                    R = int(R * light);
                    G = int(G * light);
                    B = int(B * light);
                }
                else if (light > 1)
                {
                    R = min(int(R * light), 255);
                    G = min(int(G * light), 255);
                    B = min(int(B * light), 255);
                }
                if (effect == 1)//反相
                {
                    pMem[num] = 0xffffff - pMem[num];
                    continue;
                }
                else if (effect == 2)//黑白
                {
                    R = G = B = int(R * 0.299 + G * 0.587 + B * 0.114);
                }
                pMem[num] = RGB((R * tp + GetRValue(bk_pMem[num]) * (100 - tp)) / 100,
                    (G * tp + GetGValue(bk_pMem[num]) * (100 - tp)) / 100,
                    (B * tp + GetBValue(bk_pMem[num]) * (100 - tp)) / 100);
            }
        }
    }
    putimage(dstX, dstY, &tempimg);
}

第三步:顯示按鈕上的字符啰挪,看起來(lái)是不是有點(diǎn)計(jì)算器的樣子了????

void showscreen()
{
    BeginBatchDraw();


    IMAGE black = setimage(400, 600, RGB(255, 125, 0));             // 設(shè)置繪圖,計(jì)算器的主背景色R=255,G=125,B=0
    my_putimage(0, 0, &black, RGB(255, 255, 255), 0, 1, 30, 0);

    black = setimage(100, 50, RGB(0, 0, 0));    // 設(shè)置繪圖,按鈕的顏色為黑色

    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            if (j >= 1 && j < 4 && i <= 2 || j == 0 && i == 1)
            {
                if (!button[i][j])
                    my_putimage(i * 102, 340 + j * 52, &black, RGB(255, 255, 255), 0, 1, 90, 0);
                else
                    my_putimage(i * 102, 340 + j * 52, &black, RGB(255, 255, 255), 0, 1, 50, 0);
            }
            else
            {
                if (!button[i][j])
                    my_putimage(i * 102, 340 + j * 52, &black, RGB(255, 255, 255), 0, 1, 80, 0);
                else
                {
                    if (i == 3 && j == 4 || j == 0 && i == 2 || j == 0 && i == 0)
                    {
                        IMAGE black = setimage(100, 50, RGB(240, 0, 0));    // 設(shè)置繪圖
                        my_putimage(i * 102, 340 + j * 52, &black, RGB(255, 255, 255), 0, 1, 50, 0);
                    }
                    else if (j == 4 && i == 0 || j == 4 && i == 2 || j <= 4 && j >= 0 && i == 3)
                    {
                        IMAGE green = setimage(100, 50, GREEN); // 設(shè)置繪圖
                        my_putimage(i * 102, 340 + j * 52, &green, RGB(255, 255, 255), 0, 1, 60, 0);
                    }
                    else
                    {
                        IMAGE black = setimage(100, 50, RGB(225, 100, 26)); // 設(shè)置繪圖
                        my_putimage(i * 102, 340 + j * 52, &black, RGB(255, 255, 255), 0, 1, 50, 0);
                    }
                }
            }
        }
    }

        // 添加的按鈕字符
    settextstyle(30, 0, _T("微軟雅黑"), 0, 0, 900, 0, 0, 0);
    settextcolor(RGB(255, 255, 255));
    setbkmode(TRANSPARENT);
    settextstyle(23, 0, _T("Consolas"));
    outtextxy(223, 355, _T("delete"));
    settextstyle(30, 0, _T("Consolas"));
    outtextxy(40, 350, 'C');
    outtextxy(142, 560, '.');
    outtextxy(142, 350, '0');
    outtextxy(36, 560, '(');
    outtextxy(40, 508, '1');
    outtextxy(142, 508, '2');
    outtextxy(244, 508, '3');
    outtextxy(40, 456, '4');
    outtextxy(142, 456, '5');
    outtextxy(244, 456, '6');
    outtextxy(40, 404, '7');
    outtextxy(142, 404, '8');
    outtextxy(244, 404, '9');
    outtextxy(248, 560, ')');
    settextstyle(40, 0, _T("Consolas"));
    outtextxy(342, 500, '+');
    outtextxy(342, 344, _T("÷"));
    outtextxy(342, 396, _T("×"));
    outtextxy(342, 552, '=');
    settextstyle(40, 25, _T("Consolas"));
    outtextxy(339, 448, '-');

    EndBatchDraw();
}

總結(jié):

計(jì)算器的外形構(gòu)造先介紹到這里嘲叔,我們看到整個(gè)外形構(gòu)造實(shí)現(xiàn)起來(lái)還是不復(fù)雜亡呵,當(dāng)然這個(gè)前提是easyx提供了方便的畫圖用的庫(kù),我們采用畫圖的方式將整個(gè)計(jì)算器的雛形繪制出來(lái)硫戈,后面我們?cè)倮^續(xù)介紹計(jì)算器的計(jì)算核心的實(shí)現(xiàn)锰什。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市丁逝,隨后出現(xiàn)的幾起案子汁胆,更是在濱河造成了極大的恐慌,老刑警劉巖霜幼,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫩码,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡罪既,警方通過(guò)查閱死者的電腦和手機(jī)铸题,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)琢感,“玉大人丢间,你說(shuō)我怎么就攤上這事【哉耄” “怎么了烘挫?”我有些...
    開(kāi)封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)牌捷。 經(jīng)常有香客問(wèn)我墙牌,道長(zhǎng),這世上最難降的妖魔是什么暗甥? 我笑而不...
    開(kāi)封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任喜滨,我火速辦了婚禮,結(jié)果婚禮上撤防,老公的妹妹穿的比我還像新娘虽风。我一直安慰自己,他們只是感情好寄月,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布辜膝。 她就那樣靜靜地躺著,像睡著了一般漾肮。 火紅的嫁衣襯著肌膚如雪厂抖。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天克懊,我揣著相機(jī)與錄音忱辅,去河邊找鬼七蜘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛墙懂,可吹牛的內(nèi)容都是我干的橡卤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼损搬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼碧库!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起巧勤,我...
    開(kāi)封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嵌灰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后颅悉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伞鲫,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年签舞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柒瓣。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡儒搭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芙贫,到底是詐尸還是另有隱情搂鲫,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布磺平,位于F島的核電站魂仍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拣挪。R本人自食惡果不足惜擦酌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望菠劝。 院中可真熱鬧赊舶,春花似錦、人聲如沸赶诊。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)舔痪。三九已至寓调,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锄码,已是汗流浹背夺英。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工晌涕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秋麸。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓渐排,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親灸蟆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子驯耻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容