損益分岐点分析

前回、2次方程式をやったので、その応用として損益分岐点分析をやってみます。
今回はウインドウを作ります。
今回のプロジェクト
次に以下のプログラムをコピーします。
#include<vcrt71.sbp>

'計算ボタンをクリック
Sub MainWnd_BT_KEISAN_Click()
    Dim buf[200] As Byte'汎用バッファ
    Dim mes[1000] As Byte'出力文字
    Dim uriage As Double , kotei As Double , hendou As Double , kosuu As Double
    Dim all_uriage As Double , cvp_uriage As Double
    Dim per_kouken As Double , per_hendou As Double , per_anzen As Double
    GetWindowText(GetDlgItem(hMainWnd , EB_kotei) , buf , 200)
    kotei = Val(buf)
    GetWindowText(GetDlgItem(hMainWnd , EB_hendou) , buf , 200)
    hendou = Val(buf)
    GetWindowText(GetDlgItem(hMainWnd , EB_uriage) , buf , 200)
    uriage = Val(buf) 
    GetWindowText(GetDlgItem(hMainWnd , EB_kosuu) , buf , 200)
    kosuu = Val(buf) 

    all_uriage = uriage * kosuu'現在の売上高
    per_kouken = (uriage - hendou) * kosuu * 100 / all_uriage'貢献利益率
    per_hendou = hendou * 100/ uriage'変動費率

    cvp_uriage = kotei *100 / per_kouken'損益分岐点売上高
    per_anzen = (all_uriage - cvp_uriage) * 100 / all_uriage


    sprintf(mes , Ex"損益分岐点売上高=%12.0f円\r\n" + _
        Ex"現在の売上高=%12.0f円\r\n貢献利益率=%4.2f%" + _
        Ex"\r\n変動費率=%4.2f%\r\n安全率=%4.2f%\r\n" , _
        cvp_uriage , all_uriage , per_kouken ,  per_hendou , per_anzen)    
    
    SetWindowText(GetDlgItem(hMainWnd , KEKKA) , mes)
    
    'グラフ
    Dim scale As Double
    Dim hDC As HDC
    Dim hMemDC As HDC
    Dim hBmp As HBITMAP
    Dim hBrush As HBRUSH
    Dim hPen[2] As HPEN

    scale = 200 / all_uriage

    hDC = GetDC(GetDlgItem(hMainWnd , ImageBox1))
    hMemDC = CreateCompatibleDC(hDC)
    hBmp = CreateCompatibleBitmap(hDC , 200,200)
    SelectObject(hMemDC , hBmp)
    DeleteObject(hBrush)
    hBrush = CreateSolidBrush(RGB(190 , 255 , 190))
    SelectObject(hMemDC , hBrush)
    Rectangle(hMemDC , 0,0,200,200)

    hPen[0] = CreatePen(PS_SOLID , 1 , RGB(0,0,0))
    hPen[1] = CreatePen(PS_SOLID , 1 , RGB(160,0,0))
    hPen[2] = CreatePen(PS_SOLID , 1 , RGB(255,0,0))
    '収益線
    SelectObject(hMemDC , hPen[0])
    MoveToEx(hMemDC , 0,200,ByVal NULL)
    LineTo(hMemDC , 200 , 0)

    '総費用線
    SelectObject(hMemDC , hPen[1])
    MoveToEx(hMemDC , 0 ,200 - kotei * scale ,ByVal NULL)
    LineTo(hMemDC , 200 , 200 - (kotei + hendou * kosuu) * scale)

    '固定費
    SelectObject(hMemDC , hPen[2])
    MoveToEx(hMemDC , 0 ,200 - kotei * scale ,ByVal NULL)
    LineTo(hMemDC , 200 , 200 - kotei * scale)

    DeleteObject(hPen[0])
    DeleteObject(hPen[1])
    DeleteObject(hPen[2])
    BitBlt(hDC , 0,0,200,200,hMemDC , 0,0,SRCCOPY)
    
    DeleteObject(hBmp) 
    DeleteDC(hMemDC)
    ReleaseDC(GetDlgItem(hMainWnd , ImageBox1) , hDC)
End Sub


完成品
実行結果は以下のようになります。
グラフの右上が現在の売上高になるようにしています。