• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            聚星亭

            吾笨笨且懶散兮 急須改之而奮進
            posts - 74, comments - 166, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

                        大概說下思路,方便以后回憶~
                        在窗口客戶區 繪制一個圓,圓心為邏輯坐標。這樣,它窗體設備坐標的轉換關系如下:

               1. 從設備坐標系(x,y)到邏輯坐標系(x',y')
                  x' = x - width()/2
                  y' = y + height()/2

               2. 從邏輯坐標系(x',y')到設備坐標系(x,y)
                   x = x' + width()/2
                   y = height()/2 - y'

            轉換成代碼表示如下:
                 
             1;//######################################################################
             2;// 功  能: 從邏輯坐標系到設備坐標系
             3;// 函數名: ConvlogicPos2DevicePos
             4;// 參數 
             5;//       ptLogicPos:  邏輯坐標
             6;//       pptDevicePos: 輸出參數 轉換后的設備坐標
             7;//######################################################################
             8ConvlogicPos2DevicePos proc ptLogicPos:POINT, pptDevicePos:ptr POINT
             9    assume esi:ptr POINT
            10        mov esi,pptDevicePos
            11        mov eax, ptLogicPos.x
            12        add eax, g_ptCoor.x
            13        mov [esi].x, eax
            14        
            15        mov eax, g_ptCoor.y
            16        sub eax, ptLogicPos.y
            17        mov [esi].y, eax
            18    assume esi:nothing
            19    
            20    ret
            21ConvlogicPos2DevicePos endp
            22
            23;//######################################################################
            24;// 功  能: 從設備坐標系到邏輯坐標系
            25;// 函數名: ConvDevicePos2logicPos
            26;// 參數 
            27;//       ptDevicePos: 設備坐標
            28;//       pptLogicPos: 輸出參數 轉換后的邏輯坐標
            29;//######################################################################
            30ConvDevicePos2logicPos proc ptDevicePos:POINT, pptLogicPos:ptr POINT
            31    assume esi:ptr POINT
            32        mov esi, pptLogicPos
            33        
            34        mov eax, ptDevicePos.x
            35        sub eax, g_ptCoor.x
            36        mov [esi].x, eax
            37    
            38        mov eax, ptDevicePos.y
            39        add eax, g_ptCoor.y
            40        mov [esi].y, eax
            41    assume esi:nothing
            42    
            43    ret
            44ConvDevicePos2logicPos endp

                  關于 鐘表指針的繪制就比較簡單了,用三角函數,根據分鐘數,秒數,小時數,可以計算出相應的角度,再乘以半徑就可以得到指定圓的交點坐標了,代碼如下:
              1;//#############################################################
              2;// 設置指針長度
              3;//#############################################################
              4SetPointLong proc hDC:HDC, dwPointType:DWORD, pptCoor:ptr POINT
              5    LOCAL @dwSize:DWORD
              6    assume esi:ptr POINT
              7        mov    esi,pptCoor
              8        
              9        .if dwPointType == IDT_POINTTYPE_SECOND
             10            mov @dwSize, 25
             11            
             12        .elseif  dwPointType == IDT_POINTTYPE_MIN
             13            mov @dwSize, 35
             14            
             15        .elseif  dwPointType == IDT_POINTTYPE_HOUR
             16            mov @dwSize, 45
             17            
             18        .endif
             19        
             20        mov   eax, g_ptCoor.y
             21        SUB   EAX, @dwSize
             22        mov   [esi].y, eax
             23        
             24        mov   eax, g_ptCoor.x
             25        SUB   EAX, @dwSize
             26        mov   [esi].x, eax
             27    
             28    assume esi:nothing
             29    
             30    ret
             31SetPointLong endp
             32
             33;//######################################################################
             34;// 功  能:繪制鐘表指針
             35;// 函數名: DrawColckPoint
             36;// 參數 
             37;//       hWnd: 窗口句柄
             38;//     nColor: 秒針的顏色
             39;//######################################################################
             40DrawColckPoint proc hDC:HDC, dwPointType:DWORD, nColor:DWORD
             41    LOCAL @sysTime:SYSTEMTIME
             42    LOCAL @ptCoor:POINT
             43    LOCAL @hPen:HPEN
             44    LOCAL @halfNum:WORD
             45    LOCAL @nX:DWORD
             46    LOCAL @nY:DWORD
             47    LOCAL @dwRadian:DWORD
             48    LOCAL @dwTmpTime:WORD
             49    LOCAL @dwSecSize:WORD
             50
             51    assume esi:ptr SYSTEMTIME
             52        lea esi,@sysTime
             53        invoke RtlZeroMemory, esi, sizeof @sysTime
             54        invoke GetLocalTime, esi
             55        mov @halfNum, 180
             56        
             57        xor edx, edx
             58        xor eax, eax
             59        mov @hPen, eax
             60        
             61        .if dwPointType == IDT_POINTTYPE_SECOND
             62            invoke CreatePen,PS_SOLID, 1, nColor
             63            MOV @hPen, eax
             64            mov ax, [esi].wSecond;
             65            mov @dwTmpTime, ax
             66            mov @dwSecSize, 6
             67            
             68        .elseif  dwPointType == IDT_POINTTYPE_MIN
             69            invoke CreatePen,PS_SOLID, 2, nColor
             70            MOV @hPen, eax
             71            mov ax, [esi].wMinute;
             72            mov @dwTmpTime, ax
             73            mov @dwSecSize, 6
             74        
             75        .elseif  dwPointType == IDT_POINTTYPE_HOUR
             76            invoke CreatePen,PS_SOLID, 3, nColor
             77            MOV @hPen, eax
             78            mov ax, [esi].wHour;  
             79            mov @dwTmpTime, ax
             80            mov @dwSecSize, 30  
             81        .endif
             82        
             83        invoke SelectObject,hDC, @hPen
             84        
             85        .if dwPointType == IDT_POINTTYPE_HOUR
             86            add @dwTmpTime, 9
             87            .if @dwTmpTime > 12
             88                sub @dwTmpTime, 12
             89            .endif
             90            
             91            mov ax, 12
             92            sub ax, @dwTmpTime
             93            .if ax == 0
             94                mov @dwTmpTime, 12
             95            .else
             96                mov @dwTmpTime, ax
             97            .endif
             98        .else
             99            add @dwTmpTime, 45
            100            .if @dwTmpTime > 60
            101                sub @dwTmpTime, 60
            102            .endif
            103            
            104            mov ax, 60
            105            sub ax, @dwTmpTime
            106            .if ax == 0
            107                mov @dwTmpTime, 60
            108            .else
            109                mov @dwTmpTime, ax
            110            .endif
            111        .endif
            112        
            113        mov ax, @dwTmpTime
            114        mul @dwSecSize
            115        mov @dwSecSize, ax;// 相應秒數D 
            116    
            117        FLDPI 
            118        FIDIV @halfNum  ;// 得到 1°角的弧度值
            119        FIMUL @dwSecSize  ;// 得到應秒數角的弧度值
            120        FSTP @dwRadian ;
            121        FLD  @dwRadian
            122        
            123        FCOS    ;// 得到單位圓的X
            124        FSTP  @nX
            125        FLD  @dwRadian;// 再保存一次
            126        FSIN    ;// 得到單位圓的Y
            127        FSTP  @nY
            128        
            129        invoke SetPointLong, hDC, dwPointType, addr @ptCoor
            130        
            131        FLD   @nY
            132        FIMUL @ptCoor.y
            133        FISTP @ptCoor.y
            134        
            135        FLD   @nX
            136        FIMUL @ptCoor.x
            137        FISTP @ptCoor.x
            138        
            139        push  NULL          ;// 不要返回值
            140        push  g_ptCoor.y     ;// Y坐標
            141        push  g_ptCoor.x     ;// X坐標
            142        push  hDC
            143        call MoveToEx       ;// 移動到指定位置
            144        
            145        invoke ConvlogicPos2DevicePos, @ptCoor, addr @ptCoor
            146
            147        push @ptCoor.y
            148        push  @ptCoor.x     ;// X坐標
            149        push  hDC
            150        call  LineTo
            151        invoke DeleteObject, @hPen;
            152    assume esi:nothing
            153    
            154    ret
            155DrawColckPoint endp

            最后就是繪制方面,為了防止閃爍,用了雙緩存,建了個內存DC,代碼如下:
             1OnPaintSub proc  hWnd:HWND
             2    LOCAL @ps:PAINTSTRUCT
             3    LOCAL @hDlgDC:HDC
             4    LOCAL @hMemDC:HDC
             5    LOCAL @hBmp:HBITMAP
             6    LOCAL @hBrush:HBRUSH
             7    LOCAL @tmpBuf:DWORD
             8    
             9        ;// 得到窗口DC
            10        invoke BeginPaint, hWnd, addr @ps
            11        mov @hDlgDC, eax
            12        
            13        mov eax, g_Rect.right
            14        sub eax, g_Rect.left
            15        mov @tmpBuf, eax
            16        
            17        mov eax, g_Rect.bottom
            18        sub eax, g_Rect.top
            19        invoke CreateCompatibleBitmap, @hDlgDC, @tmpBuf,eax
            20        mov @hBmp, eax
            21        
            22        invoke CreateCompatibleDC, @hDlgDC
            23        mov @hMemDC, eax
            24        
            25        invoke CreateSolidBrush, 242448h
            26        mov @hBrush, eax 
            27        
            28        invoke SelectObject,@hMemDC, @hBmp
            29        invoke SelectObject,@hMemDC, @hBrush
            30        
            31        invoke FillRect, @hMemDC,addr g_Rect, @hBrush;
            32        
            33        invoke DrawClockBK, @hMemDC             ;// 繪制鐘表背景
            34        invoke ShowTimeText, @hMemDC, IDT_COLOR_TEXT  ;// 繪制文本時間字符
            35        invoke DrawColckPoint, @hMemDC, IDT_POINTTYPE_HOUR, 0
            36        invoke DrawColckPoint, @hMemDC, IDT_POINTTYPE_MIN, 0
            37        invoke DrawColckPoint, @hMemDC, IDT_POINTTYPE_SECOND, 00000FFh
            38        
            39        mov eax, g_Rect.bottom
            40        sub eax, g_Rect.top
            41        invoke BitBlt, @hDlgDC, 00, @tmpBuf, eax, @hMemDC, 00, SRCCOPY
            42        
            43        invoke DeleteDC, @hMemDC;
            44        invoke DeleteObject, @hBrush;
            45        invoke DeleteObject, @hBmp;
            46        invoke EndPaint, hWnd, addr @ps;
            47    
            48    ret
            49OnPaintSub endp

                        最后貼下效果圖:
                              

                        恩,就這么多了,下面給出完整代碼。
            源碼下載地址         /Files/besterChen/besTimer/besTimer.rar

            Feedback

            # re: 老師布置的作業:讓寫一個電子鐘,發上來留個紀念  回復  更多評論   

            2010-07-28 08:06 by heguo
            高人

            # re: 老師布置的作業:讓寫一個電子鐘,發上來留個紀念  回復  更多評論   

            2010-07-28 08:28 by ccsdu2009
            啥語言的?

            # re: 老師布置的作業:讓寫一個電子鐘,發上來留個紀念  回復  更多評論   

            2010-07-28 09:31 by Husiwa
            DELPHI

            # re: 老師布置的作業:讓寫一個電子鐘,發上來留個紀念[未登錄]  回復  更多評論   

            2010-07-28 10:00 by ZUHD
            這是Delphi??
            這分明是pascal嘛。。。。。。

            樓主還是學生,我曾在看雪里拜讀過你的文章

            # re: 老師布置的作業:讓寫一個電子鐘,發上來留個紀念  回復  更多評論   

            2010-07-28 10:35 by yafare
            pascal,漢……

            不過MASM那堆語法也跟高級語言差不多了

            # re: 老師布置的作業:讓寫一個電子鐘,發上來留個紀念[未登錄]  回復  更多評論   

            2010-07-28 17:10 by besterchen
            @ZUHD
            (*^__^*) 嘻嘻……,那些東西就別提了,上不了臺面的……

            # re: 老師布置的作業:讓寫一個電子鐘,發上來留個紀念  回復  更多評論   

            2010-07-28 17:25 by nehCretseB
            這個明明是 VB 嘛...

            唉. 現在的人眼神越來越差了~!

            # re: 老師布置的作業:讓寫一個電子鐘,發上來留個紀念  回復  更多評論   

            2010-08-05 14:47 by 吳冬亮
            看到匯編指令 我很糾結

            # re: 老師布置的作業:讓寫一個電子鐘,發上來留個紀念  回復  更多評論   

            2010-08-08 09:06 by foxtail
            匯編現在還有應用領域嗎 搞不懂

            # re: 老師布置的作業:讓寫一個電子鐘,發上來留個紀念  回復  更多評論   

            2010-08-11 16:44 by nero
            @nehCretseB
            是VB?笑掉大牙!

            # re: 老師布置的作業:讓寫一個電子鐘,發上來留個紀念  回復  更多評論   

            2010-09-15 11:23 by SIsIA
            這好像是易語言的吧?

            # re: 老師布置的作業:讓寫一個電子鐘,發上來留個紀念[未登錄]  回復  更多評論   

            2012-04-08 17:13 by a
            應該是WIN32匯編寫的吧,我下了金山衛士會報毒。
            不過我想應該是誤報。不知道是不是
            久久久久久久久无码精品亚洲日韩 | 久久97久久97精品免视看秋霞| 久久精品嫩草影院| 久久久久亚洲精品天堂久久久久久 | 久久精品国产亚洲沈樵| 久久久久久亚洲精品无码| 亚洲午夜久久久久久噜噜噜| 成人精品一区二区久久久| 波多野结衣AV无码久久一区| 精品久久久久中文字| 久久天天躁狠狠躁夜夜躁2O2O| 9191精品国产免费久久| 日本WV一本一道久久香蕉| 色综合久久综精品| 久久w5ww成w人免费| 狠狠色丁香婷婷久久综合| 亚洲国产精品久久| 亚洲午夜久久久影院| 一本色综合久久| 精品久久久久久国产牛牛app| 国产一区二区三区久久| 777午夜精品久久av蜜臀| 少妇久久久久久被弄到高潮 | 91麻精品国产91久久久久 | 色婷婷噜噜久久国产精品12p| 久久99国产精品久久久| 久久久亚洲欧洲日产国码二区| 久久精品一本到99热免费| 亚洲欧美成人久久综合中文网| 久久精品亚洲乱码伦伦中文| 91久久成人免费| 国产免费福利体检区久久| 2020最新久久久视精品爱| 久久国产精品久久国产精品| 久久久av波多野一区二区| 少妇内射兰兰久久| 午夜精品久久久久久中宇| 久久不见久久见免费视频7| 久久精品国产亚洲AV无码麻豆| 狠狠88综合久久久久综合网| 996久久国产精品线观看|