#include <windows.h>
#include <stdio.h>
#include "resource.h"
#include<math.h>
#include"SkinH.h"
#define WS_EX_LAYERED 0x80000
#define WM_CLOCK WM_USER+1
typedef BOOL (WINAPI*FPT)(HWND,int,BOOL,DWORD);
FPT fp;
HBITMAP bp;
HDC hdc,memdc;
HINSTANCE hIns;
POINT lb_pt;
POINT current_pt;
POINT window_pt;
bool  press_flag;
HMENU hMenu;
HICON hIcon;
NOTIFYICONDATA nid;
#pragma comment(lib,"SkinHu.lib")
LRESULT CALLBACK WinSunProc(
                            HWND hwnd,      // handle to window
                            UINT uMsg,      // message identifier
                            WPARAM wParam,  // first message parameter
                            LPARAM lParam   // second message parameter
                            );int WINAPI WinMain(
                   HINSTANCE hInstance,      // handle to current instance
                   HINSTANCE hPrevInstance,  // handle to previous instance
                   LPSTR lpCmdLine,          // command line
                   int nCmdShow              // show state
                   )
{
    WNDCLASS wndcls;
    wndcls.cbClsExtra=0;
    wndcls.cbWndExtra=0;
    wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
    wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
    wndcls.hInstance=hInstance;
    wndcls.lpfnWndProc=WinSunProc;
    wndcls.lpszClassName= "Weixin2003";
    wndcls.lpszMenuName=NULL;
    wndcls.style=CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&wndcls);


    HWND hwnd;
window_pt.x = GetSystemMetrics(SM_CXSCREEN)-720;
window_pt.y = 0;
    hwnd=CreateWindowEx(WS_EX_TOPMOST|WS_EX_LAYERED|WS_EX_TOOLWINDOW, "Weixin2003",NULL,WS_POPUP|WS_SYSMENU,
        window_pt.x,window_pt.y,720,474,NULL,NULL,hInstance,NULL);
bp = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
hIns = hInstance;
    ShowWindow(hwnd,SW_SHOWNORMAL);
    UpdateWindow(hwnd);    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}
void DrawClock( HWND hwnd )
{
bp = LoadBitmap(hIns, MAKEINTRESOURCE(IDB_BITMAP1));
SYSTEMTIME tm;
hdc = GetDC(hwnd);
memdc=CreateCompatibleDC(hdc);
SelectObject(memdc,bp);
BitBlt(hdc,0,0,720,474,memdc,0,0,SRCCOPY);
GetLocalTime(&tm);
HBRUSH RedBrush;
char str[10];
SetTextColor(hdc,RGB(255,0,0));
sprintf(str,"%02d:%02d:%02d\0",tm.wHour,tm.wMinute,tm.wSecond);
// float pts[4];

RedBrush = CreateSolidBrush(RGB(255,0,0));
TextOut(hdc,333,340,str,strlen(str));
ReleaseDC(hwnd,hdc);
//tm.


}
LRESULT CALLBACK WinSunProc(
                            HWND hwnd,      // handle to window
                            UINT uMsg,      // message identifier
                            WPARAM wParam,  // first message parameter
                            LPARAM lParam   // second message parameter
                            )
{
    HMODULE hsad=LoadLibrary("user32.dll");
    
    TCHAR str[]="I love You";
    switch(uMsg)
    {
    case WM_CREATE:
        fp=(FPT)GetProcAddress(hsad,"SetLayeredWindowAttributes");
        FreeLibrary(hsad);
        fp(hwnd,RGB(255,255,255),200,3);
        SetTimer(hwnd,1,1000,NULL);
SkinH_Attach();
hIcon=LoadIcon(hIns,MAKEINTRESOURCE(IDI_CLOCK));
nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);//请看这里………………………………………………
nid.hIcon=hIcon;//请看这里……………………………………………… nid.hWnd=hwnd;//请看这里……………………………………………… strcpy(nid.szTip,"love clock"););//请看这里……………………………………………… nid.uCallbackMessage = WM_CLOCK;);//请看这里……………………………………………… nid.uID=IDI_CLOCK;//请看这里…………………………………………………………
nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;//请看这里………………………………………………
Shell_NotifyIcon(NIM_ADD,&nid);//请看这里…………………………………………
        break;
case WM_CLOCK:
break;

    case WM_TIMER:
DrawClock(hwnd);
// ReleaseDC(hwnd,hdc);
        break;
case WM_MOUSEMOVE:
POINT pt;
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
ClientToScreen(hwnd,&pt);
if(TRUE == press_flag)
MoveWindow(hwnd,window_pt.x + (pt.x - current_pt.x),
window_pt.y + pt.y - current_pt.y,720,474,FALSE); break;
    case WM_CHAR:

        break;
    case WM_LBUTTONDOWN:
press_flag = true;
        HDC hdc;
bool flag;
flag = Shell_NotifyIcon(NIM_ADD,&nid);
        hdc=GetDC(hwnd);
current_pt.x = LOWORD(lParam);
current_pt.y = HIWORD(lParam);
ClientToScreen(hwnd,&current_pt);
        ReleaseDC(hwnd,hdc);
        break;
case WM_LBUTTONUP:
POINT up_pt;
press_flag = FALSE;
up_pt.x = LOWORD(lParam);
up_pt.y = HIWORD(lParam);
ClientToScreen(hwnd,&up_pt);
window_pt.y += up_pt.y - current_pt.y;
window_pt.x += up_pt.x - current_pt.x;
break;
case WM_RBUTTONDOWN:
POINT rb_pt;
GetCursorPos(&rb_pt);
hMenu=LoadMenu(hIns,LPCSTR(IDR_MENU1));
hMenu=GetSubMenu(hMenu,0);
TrackPopupMenu(hMenu,TPM_LEFTALIGN,rb_pt.x,rb_pt.y,0,hwnd,NULL);
break;
    case WM_PAINT:
        PAINTSTRUCT ps;
        hdc=BeginPaint(hwnd,&ps);
      //  memdc=CreateCompatibleDC(hc);d
     //   SelectObject(memdc,bp);
// BitBlt(hdc,0,0,720,474,memdc,0,0,SRCCOPY);
      EndPaint(hwnd,&ps);
        break;
case WM_LBUTTONDBLCLK:
Shell_NotifyIcon(NIM_ADD,&nid);
case WM_COMMAND:
switch(wParam)
{
case ID_MEIXT:
SendMessage(hwnd,WM_CLOSE,0,0);
break;
case ID_MHIDE:

break;
case ID_MSET:

break;

}
break;
    case WM_CLOSE:
        if(IDYES==MessageBox(hwnd, "是否真的结束?", "weixin",MB_YESNO))
        {
            DestroyWindow(hwnd);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd,uMsg,wParam,lParam);
    }
    return 0;
}
问题 上面的代码主要看下我注释的那几行 注释为(请看这里…………………………………………) 我调试的时候发现加载图标是成功的,但是我运行的时候托盘里显示的图标并非我想要的,而是一个?的图标!!!

解决方案 »

  1.   

    你想要的是什么图标?
     hIcon=LoadIcon(hIns,MAKEINTRESOURCE(IDI_CLOCK));
    看看这个ID是不是你想要显示图标的ID,另外,如果是自定义图标的话,大小也有限制,好像有16*16,48*48的
      

  2.   

    既然有图标显示,说明方法没有问题。是不是你的ID写错了?换成IDR_MAINFRAME呢?
      

  3.   

    注意下ID是不是有冲突,改下ID的值试试
      

  4.   

    我的实例句柄赋值错误了,还没有产生实例的时候我就赋值了 所以LoadIcon的时候hIns 为空,调用了系统的图标,所以出现错误。