• <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>

            聚星亭

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

                        大概說(shuō)下思路,方便以后回憶~
                        在窗口客戶區(qū) 繪制一個(gè)圓,圓心為邏輯坐標(biāo)。這樣,它窗體設(shè)備坐標(biāo)的轉(zhuǎn)換關(guān)系如下:

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

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

            轉(zhuǎn)換成代碼表示如下:
                 
             1;//######################################################################
             2;// 功  能: 從邏輯坐標(biāo)系到設(shè)備坐標(biāo)系
             3;// 函數(shù)名: ConvlogicPos2DevicePos
             4;// 參數(shù) 
             5;//       ptLogicPos:  邏輯坐標(biāo)
             6;//       pptDevicePos: 輸出參數(shù) 轉(zhuǎn)換后的設(shè)備坐標(biāo)
             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;// 功  能: 從設(shè)備坐標(biāo)系到邏輯坐標(biāo)系
            25;// 函數(shù)名: ConvDevicePos2logicPos
            26;// 參數(shù) 
            27;//       ptDevicePos: 設(shè)備坐標(biāo)
            28;//       pptLogicPos: 輸出參數(shù) 轉(zhuǎn)換后的邏輯坐標(biāo)
            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

                  關(guān)于 鐘表指針的繪制就比較簡(jiǎn)單了,用三角函數(shù),根據(jù)分鐘數(shù),秒數(shù),小時(shí)數(shù),可以計(jì)算出相應(yīng)的角度,再乘以半徑就可以得到指定圓的交點(diǎn)坐標(biāo)了,代碼如下:
              1;//#############################################################
              2;// 設(shè)置指針長(zhǎng)度
              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;// 函數(shù)名: DrawColckPoint
             36;// 參數(shù) 
             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;// 相應(yīng)秒數(shù)D 
            116    
            117        FLDPI 
            118        FIDIV @halfNum  ;// 得到 1°角的弧度值
            119        FIMUL @dwSecSize  ;// 得到應(yīng)秒數(shù)角的弧度值
            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坐標(biāo)
            141        push  g_ptCoor.x     ;// X坐標(biāo)
            142        push  hDC
            143        call MoveToEx       ;// 移動(dòng)到指定位置
            144        
            145        invoke ConvlogicPos2DevicePos, @ptCoor, addr @ptCoor
            146
            147        push @ptCoor.y
            148        push  @ptCoor.x     ;// X坐標(biāo)
            149        push  hDC
            150        call  LineTo
            151        invoke DeleteObject, @hPen;
            152    assume esi:nothing
            153    
            154    ret
            155DrawColckPoint endp

            最后就是繪制方面,為了防止閃爍,用了雙緩存,建了個(gè)內(nèi)存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  ;// 繪制文本時(shí)間字符
            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: 老師布置的作業(yè):讓寫一個(gè)電子鐘,發(fā)上來(lái)留個(gè)紀(jì)念  回復(fù)  更多評(píng)論   

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

            # re: 老師布置的作業(yè):讓寫一個(gè)電子鐘,發(fā)上來(lái)留個(gè)紀(jì)念  回復(fù)  更多評(píng)論   

            2010-07-28 08:28 by ccsdu2009
            啥語(yǔ)言的?

            # re: 老師布置的作業(yè):讓寫一個(gè)電子鐘,發(fā)上來(lái)留個(gè)紀(jì)念  回復(fù)  更多評(píng)論   

            2010-07-28 09:31 by Husiwa
            DELPHI

            # re: 老師布置的作業(yè):讓寫一個(gè)電子鐘,發(fā)上來(lái)留個(gè)紀(jì)念[未登錄](méi)  回復(fù)  更多評(píng)論   

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

            樓主還是學(xué)生,我曾在看雪里拜讀過(guò)你的文章

            # re: 老師布置的作業(yè):讓寫一個(gè)電子鐘,發(fā)上來(lái)留個(gè)紀(jì)念  回復(fù)  更多評(píng)論   

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

            不過(guò)MASM那堆語(yǔ)法也跟高級(jí)語(yǔ)言差不多了

            # re: 老師布置的作業(yè):讓寫一個(gè)電子鐘,發(fā)上來(lái)留個(gè)紀(jì)念[未登錄](méi)  回復(fù)  更多評(píng)論   

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

            # re: 老師布置的作業(yè):讓寫一個(gè)電子鐘,發(fā)上來(lái)留個(gè)紀(jì)念  回復(fù)  更多評(píng)論   

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

            唉. 現(xiàn)在的人眼神越來(lái)越差了~!

            # re: 老師布置的作業(yè):讓寫一個(gè)電子鐘,發(fā)上來(lái)留個(gè)紀(jì)念  回復(fù)  更多評(píng)論   

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

            # re: 老師布置的作業(yè):讓寫一個(gè)電子鐘,發(fā)上來(lái)留個(gè)紀(jì)念  回復(fù)  更多評(píng)論   

            2010-08-08 09:06 by foxtail
            匯編現(xiàn)在還有應(yīng)用領(lǐng)域嗎 搞不懂

            # re: 老師布置的作業(yè):讓寫一個(gè)電子鐘,發(fā)上來(lái)留個(gè)紀(jì)念  回復(fù)  更多評(píng)論   

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

            # re: 老師布置的作業(yè):讓寫一個(gè)電子鐘,發(fā)上來(lái)留個(gè)紀(jì)念  回復(fù)  更多評(píng)論   

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

            # re: 老師布置的作業(yè):讓寫一個(gè)電子鐘,發(fā)上來(lái)留個(gè)紀(jì)念[未登錄](méi)  回復(fù)  更多評(píng)論   

            2012-04-08 17:13 by a
            應(yīng)該是WIN32匯編寫的吧,我下了金山衛(wèi)士會(huì)報(bào)毒。
            不過(guò)我想應(yīng)該是誤報(bào)。不知道是不是
            久久亚洲AV无码精品色午夜| MM131亚洲国产美女久久| 狠狠88综合久久久久综合网 | 久久中文字幕精品| 国产成年无码久久久久毛片| 亚洲欧美久久久久9999| 中文字幕亚洲综合久久2| 久久亚洲精品成人AV| 日韩久久无码免费毛片软件| 日本免费久久久久久久网站| 亚洲AV日韩精品久久久久| 色综合合久久天天给综看| 99久久伊人精品综合观看| 国产V综合V亚洲欧美久久| 97精品依人久久久大香线蕉97| 久久人人爽人人爽人人片AV东京热| 韩国免费A级毛片久久| 色综合久久久久久久久五月| 色播久久人人爽人人爽人人片aV| 办公室久久精品| 天天爽天天爽天天片a久久网| 国产精品对白刺激久久久| 伊人久久大香线蕉综合影院首页| 欧美久久亚洲精品| 久久91这里精品国产2020| 国产精品久久影院| 高清免费久久午夜精品| 国产人久久人人人人爽| 99久久99这里只有免费的精品| 人妻精品久久久久中文字幕69 | 伊人久久亚洲综合影院| 久久久久综合中文字幕| 人妻系列无码专区久久五月天| 九九久久精品无码专区| 久久久精品日本一区二区三区| 精品久久久久久无码国产| 国产免费久久精品丫丫| 久久久久国产一区二区三区| 久久免费99精品国产自在现线| 日韩中文久久| 99精品久久精品一区二区|