社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 道具中心
主题 : windows XP下,我想自己弄个桌面widget可以不?
shawind 离线
级别: 分版主
显示用户信息 
10  发表于: 2012-09-23   
又查了下,WS_EX_TOOLWINDOW只是在创建时有效,如果想在运行途中随意修改,还是得用ShowWIndow
弄了个例子,创建时显示正常窗口,点击最小化时在任务栏中隐藏,同时在托盘中显示图标。左键双击托盘中的图标,窗口又恢复正常,同时删去托盘中的图标。
复制代码
  1. #include <windows.h>
  2. LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
  3. char szClassName[] = "CodeBlocksWindowsApp";
  4. unsigned int iconmessage = RegisterWindowMessage("IconNotify"); //托盘图标使用的消息
  5. #define MYWM_ICON (WM_APP+100) //自定义的窗口消息
  6. int WINAPI WinMain (HINSTANCE hThisInstance,
  7.                     HINSTANCE hPrevInstance,
  8.                     LPSTR lpszArgument,
  9.                     int nCmdShow)
  10. {
  11.     HWND hwnd;
  12.     MSG messages;
  13.     WNDCLASSEX wincl;
  14.     wincl.hInstance = hThisInstance;
  15.     wincl.lpszClassName = szClassName;
  16.     wincl.lpfnWndProc = WindowProcedure;
  17.     wincl.style = CS_DBLCLKS;
  18.     wincl.cbSize = sizeof (WNDCLASSEX);
  19.     wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  20.     wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  21.     wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
  22.     wincl.lpszMenuName = NULL;
  23.     wincl.cbClsExtra = 0;
  24.     wincl.cbWndExtra = 0;
  25.     wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
  26.     if (!RegisterClassEx (&wincl))
  27.         return 0;
  28.     hwnd = CreateWindowEx (
  29.                0,
  30.                szClassName,
  31.                "Code::Blocks Template Windows App",
  32.                WS_SYSMENU|WS_MINIMIZEBOX,
  33.                CW_USEDEFAULT,
  34.                CW_USEDEFAULT,
  35.                544,
  36.                375,
  37.                HWND_DESKTOP,
  38.                NULL,
  39.                hThisInstance,
  40.                NULL
  41.            );
  42.     ShowWindow (hwnd, nCmdShow);
  43.     while (GetMessage (&messages, NULL, 0, 0))
  44.     {
  45.         TranslateMessage(&messages);
  46.         DispatchMessage(&messages);
  47.     }
  48.     return messages.wParam;
  49. }
  50. LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  51. {
  52.     NOTIFYICONDATA nid;
  53.     nid.cbSize = sizeof(NOTIFYICONDATA);
  54.     nid.hWnd = hwnd;
  55.     nid.uID = iconmessage;
  56.     nid.uFlags = NIF_ICON|NIF_MESSAGE;
  57.     nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  58.     nid.uCallbackMessage = MYWM_ICON;
  59.     switch (message)
  60.     {
  61.     case WM_SIZE:
  62.         switch(wParam)
  63.         {
  64.         case SIZE_MINIMIZED:
  65.             ShowWindow(hwnd, SW_HIDE); //从任务栏中隐藏
  66.             Shell_NotifyIcon(NIM_ADD, &nid); //显示托盘图标
  67.             break;
  68.         }
  69.         break;
  70.     case MYWM_ICON:
  71.         if(wParam == iconmessage)
  72.         {
  73.             switch(lParam)
  74.             {
  75.             case WM_LBUTTONDBLCLK:
  76.                 ShowWindow(hwnd, SW_SHOWNORMAL); //重新在任务栏中显示
  77.                 Shell_NotifyIcon(NIM_DELETE, &nid); //删除托盘图标
  78.                 break;
  79.             }
  80.         }
  81.         break;
  82.     case WM_DESTROY:
  83.         PostQuitMessage (0);
  84.         break;
  85.     default:
  86.         return DefWindowProc (hwnd, message, wParam, lParam);
  87.     }
  88.     return 0;
  89. }

え~え~お!!!
secondsen 离线
级别: 总版主
显示用户信息 
11  发表于: 2012-09-25   
按照两位的指点捣鼓出来了
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
secondsen 离线
级别: 总版主
显示用户信息 
12  发表于: 2012-09-26   
WY的代码,有一段MMX的alphablend


复制代码
  1.     __asm
  2.     {
  3.         mov            edi, pDstBmp        ; 目的像素
  4.         mov            esi, pSrcBmp        ; 源像素
  5.         xor            ebx, ebx            ; 已混合的高度
  6.         mov            ecx, blend_width    ; 要混合的宽度                                 <-------------------------------ecx记录一行的长度
  7. BLEND_BEGIN:
  8.         cmp            dword ptr[esi], 0x00FFFFFF    ; 如果alpha为0,则跳过混合部分
  9.         jna            BLEND_END
  10.         movd        mm0, [edi]            ; 把目的像素值移入mm0寄存器的低32位
  11.         movd        mm1, [esi]            ; 把源像素值移入mm1寄存器的低32位
  12.         ; Core Begin
  13.         pxor        mm2, mm2            ; 把MM2清0
  14.         punpcklbw    mm0, mm2            ; src:8 bit到16 bit以容纳结果,32bit expand to 64 bit
  15.         punpcklbw    mm1, mm2            ; dst:8 bit到16 bit以容纳结果.32bit expand to 64 bit
  16.         movq        mm3, mm1            ; 因为要用dst的Alpha值
  17.         punpckhwd    mm3, mm3            ; 高字移动到双字
  18.         punpckhdq    mm3, mm3            ; 双字移动到四字,现在有八个像素的Alpha了!
  19.         movq        mm4, mm0            ; mm4 = dst
  20.         movq        mm5, mm1            ; mm5 = src
  21.         psubusw        mm4, mm1            ; dst-src,饱和减,小于0为0
  22.         psubusw        mm5, mm0            ; src-dst,饱和减,小于0为0
  23.         pmullw        mm4, mm3            ; Alpha * (src-dst)
  24.         pmullw        mm5, mm3            ; Alpha * (dst-src)
  25.         psrlw        mm4, 8                ; 除以256,now mm4 get the result,(src-dst)<0 部分
  26.         psrlw        mm5, 8                ; 除以256,now mm5 get the result,(dst-src)>0 部分
  27.         paddusw        mm0, mm5            ; 饱和加到原图象:D=Alpha*(O-S)+S,(src-dst)<0 部分
  28.         psubusw        mm0, mm4            ; 饱和加到原图象D=S-Alpha*(S-O),(dst-src)>0 部分
  29.         packuswb    mm0, mm0            ; 紧缩到低32bit
  30.         ; Core End
  31.         movd        [edi], mm0            ; 混合结果写进目的像素
  32. BLEND_END:
  33.         add            edi, 4
  34.         add            esi, 4
  35.         loop        BLEND_BEGIN                ; 循环                                          <--------------------------------------------跳回去循环,前面没有ecx 的cmp,jxx为啥没有死循环哇??
  36.         add            esi, nextLineOffset_src    ; 加上偏移量,使定位到下行起始处
  37.         add            edi, nextLineOffset_dst
  38.         inc            ebx
  39.         mov            ecx, blend_width
  40.         cmp            ebx, blend_height        ; 若ebx小于blend_height,则转移到上面继续混合
  41.         jb            BLEND_BEGIN
  42.         EMMS                                ; 因为从mm0到mm7,这些寄存器是“借用”浮点寄存器的低64位,所以每次在用完MMX指令后一定要用EMMS指令将寄存器清空
  43.     }
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
weiwuyuan 离线
级别: ②入门
显示用户信息 
13  发表于: 2012-09-28   
引用
引用第12楼secondsen于2012-09-26 17:00发表的 :
WY的代码,有一段MMX的alphablend
.......  


loop指令等于:
if (--ecx > 0)
 jmp 标号

另外,mmx汇编指令太过烦琐,做点小工具不用也罢,用纯C写就很容易明白了:
复制代码
  1.  void AlphaBlend32(UINT* pDstBmp, int dst_width, UINT* pSrcBmp, int src_width, int blend_width, int blend_height)
  2. {
  3.  // C实现
  4.  {
  5.   const int nextLineOffset_src = (src_width - blend_width) * 4; // 混合完一行像素后,通过加上该值,便可直接定位到下行起始像素
  6.   const int nextLineOffset_dst = (dst_width - blend_width) * 4;
  7.   BYTE* pSrc = (BYTE*)pSrcBmp;
  8.   BYTE* pDst = (BYTE*)pDstBmp;
  9.   int below_A, below_R, below_G, below_B;
  10.   int above_A, above_R, above_G, above_B;
  11.   for (int h=0, w=0; h<blend_height; h++)
  12.   {
  13.    for (w=0; w<blend_width; w++)
  14.    {
  15.     above_B = *pSrc++;
  16.     above_G = *pSrc++;
  17.     above_R = *pSrc++;
  18.     above_A = *pSrc++;
  19.     if (above_A == 0)
  20.     {
  21.      pDst += 4;
  22.      continue;
  23.     }
  24.     below_B = *pDst;
  25.     below_G = *(pDst+1);
  26.     below_R = *(pDst+2);
  27.     below_A = *(pDst+3);
  28.     *pDst++ = below_B - (below_B-above_B)*above_A/255;
  29.     *pDst++ = below_G - (below_G-above_G)*above_A/255;
  30.     *pDst++ = below_R - (below_R-above_R)*above_A/255;
  31.     if (below_A == 255)
  32.      *pDst++ = 255;
  33.     else
  34.      *pDst++ = below_A - (below_A-above_A)*above_A/255;
  35.    }
  36.    pSrc += nextLineOffset_src;
  37.    pDst += nextLineOffset_dst;
  38.   }
  39.  }
  40. }


secondsen 离线
级别: 总版主
显示用户信息 
14  发表于: 2012-10-05   
WY的程序,托盘的菜单,右击出现之后,点击桌面,菜单也不消失啊??
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
描述
快速回复

认证码:

验证问题:
12-5=?,答案:7 正确答案:7
按"Ctrl+Enter"直接提交