返回列表 发帖

[原创]调用计算器并使它居中显示

[watermark]文件压缩后只有613个字节。解压后2K。
下载地址:

[原创]调用计算器并使它居中显示

居中没有弄,获取桌面大小,然后设置StartUpInfo,CreateProcess

最终代码大小600字节
还是可以再压的...

TOP

[原创]调用计算器并使它居中显示

居中是最主要的,不弄就没有意思了。主要是看居中的算法。公布源码:
.386
.Model Flat, StdCall
Option Casemap :None
Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc
IncludeLib user32.lib
IncludeLib kernel32.lib
include macro.asm
.CODE
Main proc
    local t:RECT,hInstance:DWORD,hCalc:DWORD,w:DWORD,h:DWORD
    invoke GetModuleHandle,NULL
    mov hInstance,eax
    invoke WinExec,CTXT("calc"),SW_MINIMIZE
    invoke FindWindow,NULL,CTXT("计算器")
    mov hCalc,eax
    .if eax!=0
        invoke GetWindowRect,hCalc,addr t
        invoke GetSystemMetrics,SM_CXSCREEN
        add eax,t.left
        sub eax,t.right
        shr eax,1
        mov w,eax
        invoke GetSystemMetrics,SM_CYSCREEN
        add eax,t.top
        sub eax,t.bottom
        shr eax,1
        mov h,eax
        invoke SetWindowPos,hCalc,HWND_TOPMOST,w,h,0,0,SWP_NOSIZE
    .endif
    invoke ExitProcess,0
Main endp
END Main
居中是其一,还有设置窗口模态为总在最前端。

TOP

[原创]调用计算器并使它居中显示

我以为楼主是比大小呢,原来是看算法的,呵呵
那好,就弄个居中的,再来个窗口总在最前端^_^

未压缩时952字节
PS:没想到楼主汇编也玩得头头是道哦

TOP

[原创]调用计算器并使它居中显示

简单处理一下,还可减少,手工进行处理,可减少更多,不过意义不大。
初次练笔,源码已经公布,谁都可以去处理,没什么了。。。

TOP

[原创]调用计算器并使它居中显示

有个问题请教下,你的汇编代码这里
mov hInstance,eax
是什么用途呀,虽然偶不怎么会汇编,但是这里实在没看出什么意思,因为后面好象一直没有提到这个hInstance啊.

TOP

[原创]调用计算器并使它居中显示

c的:
  1. &#35;include <windows.h>
  2. int APIENTRY WinMain(HINSTANCE hinstExe, HINSTANCE, PSTR pszCmdLine, int nCmdShow)
  3. {
  4. char cmdLine[] = "calc.exe";
  5. STARTUPINFO si = {sizeof(STARTUPINFO)};
  6. PROCESS_INFORMATION pi = {0};
  7. if(!CreateProcess(NULL, cmdLine, NULL, NULL, false, 0, NULL, NULL, &si, &pi))
  8. return -1;
  9. Sleep(300);
  10. RECT rc = {sizeof(RECT)};
  11. HWND hwnd = FindWindow(NULL, "计算器");
  12. if(NULL == hwnd)
  13. return -1;
  14. if(!GetWindowRect(hwnd, &rc))
  15. return -1;
  16. int cx = GetSystemMetrics(SM_CXSCREEN);
  17. int cy = GetSystemMetrics(SM_CYSCREEN);
  18. cx = (cx - rc.right + rc.left) / 2;
  19. cy = (cy - rc.bottom + rc.top) / 2;
  20. si.dwX = cx;
  21. si.dwY = cy;
  22. si.dwXSize = rc.right - rc.left;
  23. si.dwYSize = rc.bottom - rc.top;
  24. SetWindowPos(hwnd, HWND_TOPMOST, si.dwX, si.dwY, si.dwXSize, si.dwYSize, SWP_SHOWWINDOW);
  25. return 0;
  26. }
复制代码
  1. .386
  2. .model flat, stdcall
  3. option casemap:none
  4. include windows.inc
  5. include user32.inc
  6. include kernel32.inc
  7. includelib user32.lib
  8. includelib kernel32.lib
  9. .data?
  10. rect RECT <>
  11. hwnd HWND ?
  12. showx dword ?
  13. showy dword ?
  14. xsize dword ?
  15. ysize dword ?
  16. .data
  17. szName byte ';calc';, 0
  18. szApp byte ';计算器';, 0
  19. .code
  20. start:
  21. invoke WinExec, offset szName, 0
  22. invoke FindWindow, NULL, offset szApp
  23. MOV [hwnd], EAX
  24. invoke GetWindowRect, EAX, offset rect
  25. invoke GetSystemMetrics, SM_CXSCREEN
  26. SUB EAX, rect.right
  27. ADD EAX, rect.left
  28. SAR EAX, 1
  29. MOV [showx], EAX
  30. invoke GetSystemMetrics, SM_CYSCREEN
  31. SUB EAX, rect.bottom
  32. ADD EAX, rect.top
  33. SAR EAX, 1
  34. MOV [showy], EAX
  35. MOV EAX, rect.right
  36. SUB EAX, rect.left
  37. MOV [xsize], EAX
  38. MOV EAX, rect.bottom
  39. SUB EAX, rect.top
  40. MOV [ysize], EAX
  41. invoke SetWindowPos, hwnd, HWND_TOPMOST, showx, showy, xsize, ysize, SWP_SHOWWINDOW
  42. ret
  43. end start
复制代码

TOP

[原创]调用计算器并使它居中显示

     用C++实现代码很短。我在C++源码中用的是GetSystemMetrics(0)获取桌面,其实还可以用到EnumDisplaySettings来获取,不过后者稍麻烦。
     居中的算法应该不唯一,希望你能写出与我不同的算法。

     回X86的问题:那里确实没有什么意思,省略即可。

TOP

[原创]调用计算器并使它居中显示

例如还有一种算法:
   由屏幕长和宽两条直角边,利用勾股定理求出斜边长度,然后同理可获取计算器窗口的斜边(对角线长度),然后让这两条斜边对齐,做直线运动,当计算器斜边到达屏幕斜边中点的时候,停止运动。换话话来说:就是让计算器窗口从屏幕左上角向屏幕右下角滑动,当滑到中间的时候停止。实现起来应该比上述方面麻烦的多,但乐趣不同!
   由于计算机CPU指定非常快,所以可能看不到滑动效果就直接居中了,这时如果想看到滑动轨迹,在每次改变窗口位置的地方加Sleep(100)即可。
   因为意义不大,我也赖得再写出源码,编程思想就这样,大家理解就行。

TOP

返回列表 回复 发帖