C语言+windows API仿写类酷狗播放器(1)

来源:互联网 发布:vi设计软件 编辑:程序博客网 时间:2024/05/09 19:40

源码图片资源下载:http://yunpan.cn/cjfX8pUHciGYs  提取码 da83


#include "KuGou.h"int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,                    PSTR szCmdLine, int iCmdShow){     static TCHAR szAppName[] = TEXT ("KuGou") ;     HWND         hwnd ;     MSG          msg ;     WNDCLASS     wndclass ;     wndclass.style         = NULL;     wndclass.lpfnWndProc   = WndProc ;     wndclass.cbClsExtra    = 0 ;     wndclass.cbWndExtra    = 0 ;     wndclass.hInstance     = hInstance ;     wndclass.hIcon         = (HICON)LoadImage(NULL,TEXT ("image\\icon.ico"),IMAGE_ICON,0,0,LR_LOADFROMFILE);     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;     wndclass.lpszMenuName  = NULL ;     wndclass.lpszClassName = szAppName ;     if (!RegisterClass (&wndclass))     {          MessageBox (NULL, TEXT ("This program requires Windows NT!"),                       szAppName, MB_ICONERROR) ;          return 0 ;     } //注册子窗口控件     RegisterCtl();     hwnd = CreateWindow (szAppName,                  // window class name                          TEXT ("The Hello Program"), // window caption                          0,        // window style                          CW_USEDEFAULT,              // initial x position                          CW_USEDEFAULT,              // initial y position                          CW_USEDEFAULT,              // initial x size                          CW_USEDEFAULT,              // initial y size                          NULL,                       // parent window handle                          NULL,                       // window menu handle                          hInstance,                  // program instance handle                          NULL) ;                     // creation parameters          SetWindowLong(hwnd,GWL_STYLE,WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_POPUP); ShowWindow (hwnd, SW_SHOWNORMAL) ;     UpdateWindow (hwnd) ;          while (GetMessage (&msg, NULL, 0, 0))     {          TranslateMessage (&msg) ;          DispatchMessage (&msg) ;     }      return msg.wParam ;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){     HDC         hdc ;     PAINTSTRUCT ps ; TRACKMOUSEEVENT tme; ZeroMemory(&tme, sizeof(tme)); static int bInit = false;  //阻止多次初始化,导致最小化再打开窗口边框丢失 int i;     switch (message)     {     case WM_CREATE:  //初始化  Init( hwnd );  //创建控件  CreateChildCtr(lParam, st_ui.hwndButton,hwnd);  return 0 ; case WM_SIZE: if (!bInit) InitSize(lParam); InitCtlRt(st_ui.ctrRt); AdjustCtlPlace(); bInit = true;     return 0;     case WM_PAINT:          hdc = BeginPaint (hwnd, &ps) ;  //画界面  DrawUI(hdc);                    EndPaint (hwnd, &ps) ;          return 0 ;case WM_LBUTTONDOWN:if (CLOSE == mouseIn[CLOSE]){DeleteObj();PostQuitMessage(0);DestroyWindow(hwnd);}if (MIN == mouseIn[MIN])::SendMessage(hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);::SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);return 0 ;     case WM_MOUSEMOVE:int CtrId;CtrId = isInWndCtr(LOWORD(lParam),HIWORD(lParam));if (-1 != CtrId)InvalidateRect(hwnd,&st_ui.ctrRt[mouseIn[CtrId]],false);if (-1 != lastmouseIn && CtrId != lastmouseIn){InvalidateRect(hwnd,&st_ui.ctrRt[lastmouseIn],false);lastmouseIn = -1;}        //追踪鼠标 if( !bMouseTracking )  {  tme.cbSize = sizeof(TRACKMOUSEEVENT);  tme.dwFlags = TME_LEAVE;  tme.hwndTrack = hwnd;   tme.dwHoverTime = 0;TrackMouseEvent(&tme); bMouseTracking = true; }return 0 ;     //处理WM_MOUSELEAVE,鼠标离开窗口会出发此消息case WM_MOUSELEAVE:::SendMessage(hwnd, WM_MOUSEMOVE, 0, 0);bMouseTracking = false;return 0;case WM_KEYUP:if (wParam == VK_ESCAPE) {PostQuitMessage(0);::DestroyWindow(hwnd);}return 0 ;    case WM_DESTROY:DeleteObj();PostQuitMessage(0);        DestroyWindow(hwnd);        return 0 ;     }     return DefWindowProc (hwnd, message, wParam, lParam) ;}//初始化BOOL Init( HWND hwnd ){//初始化窗口数据st_scroll.bShow = false;bMouseTracking = false;//初始化位图st_ui.g_hdc = GetDC(hwnd);  //从文件加载3张边框位图st_ui.g_hTop = (HBITMAP)LoadImage(NULL,TEXT ("image\\top.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);   st_ui.g_hLeft = (HBITMAP)LoadImage(NULL,TEXT ("image\\left.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);  st_ui.g_hBottom =  (HBITMAP)LoadImage(NULL,TEXT ("image\\bottom.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);  //初始化关闭、最小按钮st_ui.g_hClose[0] = (HBITMAP)LoadImage(NULL,TEXT ("image\\close1.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);   st_ui.g_hClose[1] = (HBITMAP)LoadImage(NULL,TEXT ("image\\close2.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);  st_ui.g_hMin[0] =  (HBITMAP)LoadImage(NULL,TEXT ("image\\min1.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);  st_ui.g_hMin[1] =  (HBITMAP)LoadImage(NULL,TEXT ("image\\min2.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);  //获取位图尺寸GetObject(st_ui.g_hTop, sizeof(st_ui.infoTop), &st_ui.infoTop);GetObject(st_ui.g_hLeft, sizeof(st_ui.infoLeft), &st_ui.infoLeft);GetObject(st_ui.g_hBottom, sizeof(st_ui.infoBottom), &st_ui.infoBottom);GetObject(st_ui.g_hClose[0], sizeof(st_ui.infoClose[0]), &st_ui.infoClose[0]);GetObject(st_ui.g_hClose[1], sizeof(st_ui.infoClose[1]), &st_ui.infoClose[1]);GetObject(st_ui.g_hMin[0], sizeof(st_ui.infoMin[0]), &st_ui.infoMin[0]);GetObject(st_ui.g_hMin[1], sizeof(st_ui.infoMin[1]), &st_ui.infoMin[1]);//建立兼容DCst_ui.g_mdc = CreateCompatibleDC(st_ui.g_hdc);    ReleaseDC(hwnd,st_ui.g_hdc);  //播放音乐    PlaySound (TEXT ("music\\hellokugou.wav"), NULL, SND_FILENAME | SND_ASYNC) ;return TRUE;}//画界面void DrawUI(HDC hdc){  int i; //画界面顶部  SelectObject (st_ui.g_mdc, st_ui.g_hTop) ;  StretchBlt (hdc, 0, 0, st_ui.w_top,st_ui.h_top,  st_ui.g_mdc, 0, 0, st_ui.infoTop.bmiHeader.biWidth,   st_ui.infoTop.bmiHeader.biHeight, SRCCOPY) ;   //画界面左边  SelectObject (st_ui.g_mdc, st_ui.g_hLeft) ;  StretchBlt (hdc, 0, st_ui.h_top, st_ui.w_left,st_ui.h_left,  st_ui.g_mdc, 0, 0, st_ui.infoLeft.bmiHeader.biWidth,   st_ui.infoLeft.bmiHeader.biHeight, SRCCOPY) ;   //画界面顶部  SelectObject (st_ui.g_mdc, st_ui.g_hBottom) ;  StretchBlt (hdc, 0, st_ui.h_top+st_ui.h_left, st_ui.w_bottom,st_ui.h_bottom,  st_ui.g_mdc, 0, 0, st_ui.infoBottom.bmiHeader.biWidth,   st_ui.infoBottom.bmiHeader.biHeight, SRCCOPY) ;   //画最小化按钮(第一帧)  i = 0;  if (MIN == mouseIn[MIN])  i = 1;  SelectObject (st_ui.g_mdc, st_ui.g_hMin[i]) ;  StretchBlt (hdc, st_ui.w_top - 2 * st_ui.w_min, 0, st_ui.w_min,st_ui.h_min,  st_ui.g_mdc, 0, 0, st_ui.infoMin[0].bmiHeader.biWidth,   st_ui.infoMin[0].bmiHeader.biHeight, SRCCOPY) ;   //画最关闭按钮(第一帧)  i = 0;  if (CLOSE == mouseIn[CLOSE])  i = 1;  SelectObject (st_ui.g_mdc, st_ui.g_hClose[i]) ;  StretchBlt (hdc, st_ui.w_top - st_ui.w_close, 0, st_ui.w_close,st_ui.h_close,  st_ui.g_mdc, 0, 0, st_ui.infoClose[0].bmiHeader.biWidth,   st_ui.infoClose[0].bmiHeader.biHeight, SRCCOPY) ;  }//初始化界面位图尺寸void InitSize(LPARAM lParam){  int cxClient = 0;  int cyClient = 0;  cxClient = LOWORD (lParam) ;  cyClient = HIWORD (lParam) ;  st_ui.w_top = cxClient + ::GetSystemMetrics(SM_CXSIZEFRAME); //左边框  st_ui.h_top = cyClient * 1 / 5;  st_ui.w_left = cxClient * 1 / 32;  st_ui.h_left = cyClient - st_ui.h_top + GetSystemMetrics(SM_CYSIZEFRAME);//下边框  st_ui.w_bottom = cxClient + ::GetSystemMetrics(SM_CXSIZEFRAME);   st_ui.h_bottom = GetSystemMetrics(SM_CYCAPTION);  //标题  st_ui.w_close = GetSystemMetrics(SM_CXICON);  st_ui.h_close = GetSystemMetrics(SM_CYICON);  st_ui.w_min = GetSystemMetrics(SM_CXICON);  st_ui.h_min = GetSystemMetrics(SM_CYICON);}//回收资源void DeleteObj(){::CoUninitialize();DeleteObject(st_ui.g_hTop);DeleteObject(st_ui.g_hLeft);DeleteObject(st_ui.g_hBottom);DeleteObject(st_ui.g_hMin[0]);DeleteObject(st_ui.g_hMin[1]);DeleteObject(st_ui.g_hClose[0]);DeleteObject(st_ui.g_hClose[1]);}//是否改变控件,返回控件idint isInWndCtr(int x, int y){int ctrId = -1;ctrId = GetMouseInCtrId(x,y);switch (ctrId){case CLOSE:if (-1 == lastmouseIn)SetLastCtlId(CLOSE);mouseIn[CLOSE] = CLOSE;OnlyMe(mouseIn,CTRNUM,CLOSE);return CLOSE;case MIN:if (-1 == lastmouseIn)SetLastCtlId(MIN);mouseIn[MIN] =  MIN;OnlyMe(mouseIn,CTRNUM,MIN);return MIN;default:memset(mouseIn,-1,sizeof(mouseIn));return -1;}}//初始化控件区域void InitCtlRt(RECT rt[CTRNUM]){int i = 0;int l = 0, t = 0, r = 0, b = 0;for (i = 0; i < CTRNUM; ++i){l = 0, t = 0, r = 0, b = 0;switch (i){case CLOSE:l = st_ui.w_top - st_ui.w_close;t = 0;r = l + st_ui.w_close;b = t + st_ui.h_close;break;case MIN:l = st_ui.w_top - 2 * st_ui.w_min;t = 0;r = l + st_ui.w_min;b = t + st_ui.h_min;break;default:break;}rt[i].left = l;rt[i].top  = t;rt[i].right  = r;rt[i].bottom  = b;}}//获取鼠标所在控件idint GetMouseInCtrId(int x, int y){//主窗口控件int i = 0;for (i = 0; i < CTRNUM; ++i){if (POINT_IN_RECT(x,y,st_ui.ctrRt [i].left,st_ui.ctrRt [i].top,st_ui.ctrRt [i].right,st_ui.ctrRt [i].bottom)){return i;}}return -1;}//创建子窗口控件void CreateChildCtr(LPARAM lParam, HWND hwndButton[CTRNUM],HWND hwnd){  int i;   for (i = 0 ; i < CTRNUM ; i++)  {     hwndButton[i] = CreateWindow ( szClass[i],                    button[i].szText,                   WS_CHILD | WS_VISIBLE | button[i].iStyle,                   0,  0,                   0 , 0,                   hwnd, (HMENU) i,                   ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;  }}//音乐列表子窗口控件LRESULT CALLBACK MusListWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC         hdc ;     PAINTSTRUCT ps ;     RECT        rect ;     HINSTANCE      hInstance ; static int cxClient, cyClient;          switch (message)     {     case WM_CREATE :          CreateMusScroll(hwnd, lParam);  ShowScroll(hwndScroll);  HideScroll(hwndScroll);  SetTimer(hwnd,SCROLL_ID, 100, NULL);  //用于显示和隐藏滚动条    return 0 ;     case WM_LBUTTONDOWN :          return 0 ; case WM_SIZE:          cxClient = LOWORD (lParam) ;          cyClient = HIWORD (lParam) ;  //初始化音乐列表  InitMus(cxClient,cyClient);  AdjustScollPlace(cxClient, cyClient);  st_mus.mus_lis .hList = hwnd;          return 0 ;    case WM_ERASEBKGND : SetCtlColor(RGB(120,150,240),wParam, hwnd);return 0;     case WM_PAINT :          hdc = BeginPaint (hwnd, &ps) ;            //画音乐列表          DrawMusicList(hdc,st_mus.mus_lis,RGB(20,100,20),  RGB(120,150,240),RGB(120,150,240));          EndPaint (hwnd, &ps) ;          return 0 ; case WM_TIMER: ShowScroll(hwndScroll); return 0; case WM_DESTROY: if (st_mus.mus_lis.deletnFlag != NULL) { free(st_mus.mus_lis.deletnFlag); st_mus.mus_lis.deletnFlag = NULL; } if (st_mus.mus_lis.playnFlag != NULL) { free(st_mus.mus_lis.playnFlag); st_mus.mus_lis.playnFlag = NULL; } KillTimer(hwnd, SCROLL_ID); return 0;     }     return DefWindowProc (hwnd, message, wParam, lParam) ;}//注册子窗口控件类void RegisterCtl(){ int i; WNDCLASS wndclass[CTRNUM]; for (i = 0; i < CTRNUM; ++i) { ZeroMemory(&wndclass[i],sizeof(wndclass[i])); wndclass[i].lpfnWndProc   = pFucWndProc[i] ;  wndclass[i].cbWndExtra    = sizeof (long) ; wndclass[i].hIcon         = NULL ; wndclass[i].lpszClassName = szClass[i] ; if (!RegisterClass (&wndclass[i])) {  MessageBox (NULL, TEXT ("Error In The RegisterCtl"),   (LPCWSTR)szClass[i], MB_ICONERROR) ;  continue; } }}//调整控件位置void AdjustCtlPlace(){    int i;for (i = 0 ; i < CTRNUM ; ++i){        switch (i){case 0:    //音乐列表MoveWindow (st_ui.hwndButton[i],st_ui.w_left, st_ui.h_top,(st_ui.w_top - st_ui.w_left) * 1 / 3, st_ui.h_left, TRUE) ;break;case 1:    //网络区域MoveWindow (st_ui.hwndButton[i],st_ui.w_left + (st_ui.w_top - st_ui.w_left) * 1 / 3, st_ui.h_top,(st_ui.w_top - st_ui.w_left) * 2 / 3, st_ui.h_left, TRUE) ;break;case 2:    //网络区域MoveWindow (st_ui.hwndButton[i],0, st_ui.h_top, st_ui.w_left, st_ui.h_left / 8, TRUE) ;break;default:break;}}}//只有我有效void OnlyMe(int mouseIn[],int n,int CtlId){memset(mouseIn,-1,n*sizeof(mouseIn));mouseIn[CtlId] = CtlId;}//设置上一个子控件idvoid SetLastCtlId(int CtlId){lastmouseIn = CtlId;}//音乐列表滚动条回调函数LRESULT CALLBACK ScrollWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ HDC         hdc ; TRACKMOUSEEVENT tme; ZeroMemory(&tme, sizeof(tme));     PAINTSTRUCT ps ; static int cxScroll,cyScroll,yDown; switch (message)     {     case WM_CREATE :  return 0 ; case WM_MOUSEMOVE: //拖动鼠标 MouseDrag(hwnd,lParam,yDown); //移动鼠标 MouseMove(hwnd,lParam); //追踪鼠标 if( !st_scroll.bMouseTracking )  {  tme.cbSize = sizeof(TRACKMOUSEEVENT);  tme.dwFlags = TME_LEAVE;  tme.hwndTrack = hwnd;   tme.dwHoverTime = 0;TrackMouseEvent(&tme); st_scroll.bMouseTracking = true; }  return 0;     case WM_LBUTTONDOWN : //处理鼠标动作  MouseDown(hwnd,lParam, yDown);          return 0 ; case WM_LBUTTONUP: st_scroll.bLeftDown = false; return 0; case WM_MOUSELEAVE:  ::SendMessage(hwnd, WM_MOUSEMOVE, 0, 0);  bMouseTracking = false;          return 0 ; case WM_SIZE:          cxScroll = LOWORD (lParam) ;          cyScroll = HIWORD (lParam) ;  InitScroll(cxScroll, cyScroll);  return 0 ;    case WM_ERASEBKGND : ::SetCtlColor (RGB(20,50,240),wParam, hwnd); return 0;     case WM_PAINT :          hdc = BeginPaint (hwnd, &ps) ;    DrawScrollCtl(hdc);          EndPaint (hwnd, &ps) ;          return 0 ; case WM_DESTROY: return 0;     }     return DefWindowProc (hwnd, message, wParam, lParam) ;}//创建音乐列表滚动条void CreateMusScroll(HWND hwnd, LPARAM lParam){ //创建创建滚动条窗口   HINSTANCE hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE);   hwndScroll = CreateWindow (TEXT ("static"), TEXT ("0"),                                 WS_CHILD | WS_VISIBLE | SS_CENTER,                                 0, 0, 0, 0,                                 hwnd, (HMENU) SCROLL,                                  hInstance, NULL) ;      SetWindowLong (hwndScroll,GWL_WNDPROC, (LONG) ScrollWndProc) ;}//设置控件颜色void SetCtlColor(COLORREF color, WPARAM wParam, HWND hwnd){    RECT rect;HDC hdc;hdc = (HDC)wParam;HBRUSH hbr;hbr = ::CreateSolidBrush(color);::GetClientRect(hwnd, &rect);::FillRect(hdc, &rect, hbr);}//调整滚动条位置void AdjustScollPlace(int x, int y){MoveWindow (hwndScroll,x * 15 * 1 / 16,0, x * 1 / 16,y, TRUE) ;}//网络窗口回调函数LRESULT CALLBACK InternetWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC         hdc ;     PAINTSTRUCT ps ;     RECT        rect ;     HINSTANCE      hInstance ; static int cxClient, cyClient;          switch (message)     {     case WM_CREATE :  return 0 ;     case WM_LBUTTONDOWN :          return 0 ; case WM_SIZE:          cxClient = LOWORD (lParam) ;          cyClient = HIWORD (lParam) ;          return 0 ;    case WM_ERASEBKGND : SetCtlColor(RGB(230, 230, 230),wParam,hwnd);return 0;     case WM_PAINT :          hdc = BeginPaint (hwnd, &ps) ;                              EndPaint (hwnd, &ps) ;          return 0 ;     }     return DefWindowProc (hwnd, message, wParam, lParam) ;}//显示滚动条void ShowScroll(HWND hwnd){if (!st_scroll.bShow){ShowWindow(hwnd, SW_SHOWNORMAL);st_scroll.bShow = true;}}//隐藏滚动条void HideScroll(HWND hwnd){if (st_scroll.bShow){ShowWindow(hwnd, SW_HIDE);st_scroll.bShow = false;}}//初始化滚动条控件上按钮、下按钮、滚动块void InitScroll(int x, int y){st_scroll.w = x;st_scroll.h = y;st_scroll.iMove  = 0;st_scroll.nMove  = 10;st_scroll.bMouseTracking = false;st_scroll.bLeftDown = false;memset(st_scroll.mouseIn,-1,sizeof(st_scroll.mouseIn));//颜色st_scroll.color[0] = RGB(20, 20, 220);st_scroll.color[1] = RGB(50, 50, 150);st_scroll.color[2] = RGB(20, 20, 100);st_scroll.color[3] = RGB(20, 20, 220);st_scroll.color[4] = RGB(50, 50, 150);st_scroll.rtUp.left = 0;st_scroll.rtUp.top  = 0;st_scroll.rtUp.right  = x;st_scroll.rtUp.bottom   = x;st_scroll.rtDrag.left = 0;st_scroll.rtDrag.top  = x;st_scroll.rtDrag.right  = x;st_scroll.rtDrag.bottom   = y / 2;st_scroll.rtDown.left = 0;st_scroll.rtDown.top  = y - x;st_scroll.rtDown.right  = x;st_scroll.rtDown.bottom   = y;st_scroll.rtScl.left = 0;st_scroll.rtScl.top  = 0;st_scroll.rtScl.right  = x;st_scroll.rtScl.bottom   = y;st_scroll.rtScroll[0] = st_scroll.rtUp;st_scroll.rtScroll[1] = st_scroll.rtDrag;st_scroll.rtScroll[2] = st_scroll.rtDown;}//画滚动条void DrawScrollCtl(HDC hdc){//创建兼容dcHDC mdc = CreateCompatibleDC(hdc);  HBITMAP hMemBmp = ::CreateCompatibleBitmap (hdc,st_scroll.w, st_scroll.h);SelectObject(mdc, hMemBmp);HBRUSH hr;hr = CreateSolidBrush(RGB(255,255,255));SelectObject(mdc, hr);RECT rt;rt.left = 0;rt.top = 0;rt.right = st_scroll.w;rt.bottom = st_scroll.h;FillRect(mdc,&rt,hr);//在mdc上画图//画矩形DrawRectangle(mdc,st_scroll.color[2],st_scroll.color[2],st_scroll.rtDrag);DrawRectangle(mdc,st_scroll.color[0],st_scroll.color[0],st_scroll.rtUp);DrawRectangle(mdc,st_scroll.color[3],st_scroll.color[3],st_scroll.rtDown);//画三角形POINT ptUp[3] = {{st_scroll.rtUp.right / 2, 0},{0, st_scroll.rtUp.bottom},{st_scroll.rtUp.right, st_scroll.rtUp.bottom}};POINT ptDown[3] = {{st_scroll.w / 2, st_scroll.h},{st_scroll.rtDown.left, st_scroll.rtDown.top},{st_scroll.w , st_scroll.rtDown.top}};DrawTriangle(mdc,st_scroll.color[1],st_scroll.color[1],ptUp[0],ptUp[1],ptUp[2]);DrawTriangle(mdc,st_scroll.color[4],st_scroll.color[4],ptDown[0],ptDown[1],ptDown[2]);//将mdc内容贴到hdc上    BitBlt (hdc, 0, 0, st_scroll.w,st_scroll.h ,  mdc, 0, 0, SRCCOPY) ;DeleteObject(hMemBmp);DeleteObject(hr);}void DrawTriangle(HDC hdc,COLORREF RgnColor, COLORREF LineColor  , POINT ptTop, POINT ptLeft, POINT ptRight){HBRUSH hr;HPEN pen;hr = CreateSolidBrush(LineColor);pen = CreatePen(PS_SOLID,0,RgnColor);    SelectObject (hdc,hr) ;SelectObject (hdc,pen);POINT pt[] =        //画三角形{ptTop, ptLeft,ptRight,ptTop, };::Polyline(hdc, pt, 4);    HRGN rgn = ::CreatePolygonRgn (pt,4,ALTERNATE);::FillRgn(hdc,rgn,hr);DeleteObject (hr) ;DeleteObject (pen) ;}void DrawRectangle(HDC hdc,COLORREF RgnColor, COLORREF LineColor  , RECT rt){HBRUSH hr;HPEN pen;hr = CreateSolidBrush(LineColor);pen = CreatePen(PS_SOLID,0,RgnColor);    SelectObject (hdc,hr) ;SelectObject (hdc,pen);::Rectangle (hdc,rt.left ,rt.top ,rt.right ,rt.bottom ); //0 409 20 20DeleteObject (hr) ;DeleteObject (pen) ;}//获得鼠标在滚动条中的控件(如上按钮等)int GetMouInScllCtrId(int x, int y){//主窗口控件int i = 0;for (i = 0; i < SCROLL; ++i){if (POINT_IN_RECT(x,y,st_scroll.rtScroll[i].left,st_scroll.rtScroll[i].top,st_scroll.rtScroll[i].right-st_scroll.rtScroll[i].left,st_scroll.rtScroll[i].bottom - st_scroll.rtScroll[i].top)){return i;}}return -1;}//处理滚动条鼠标动作void MouseDown(HWND hwnd, LPARAM lParam, int& yDown){ int id; int x,y; x = LOWORD(lParam); y = HIWORD(lParam); id = ::GetMouInScllCtrId(x, y);     //判断鼠标是否在控件上 //1、在控件上 if (-1 != id) { //1.1 处理左键单击 switch(id)  { case UP: if (st_scroll.rtDrag.top > st_scroll.rtUp.bottom) {if (st_scroll.rtDrag.top - st_scroll.nMove>= st_scroll.rtUp.bottom)st_scroll.nMove = st_scroll.rtUp.bottom;MoveRect(st_scroll.rtDrag,0,-st_scroll.nMove);InvalidateRect(hwnd,&st_scroll.rtScl,false); } break; case DOWN: if (st_scroll.rtDrag.bottom <= st_scroll.rtDown.top) {if (st_scroll.rtDrag.bottom+st_scroll.nMove>= st_scroll.rtDown.top)st_scroll.nMove = st_scroll.rtDown.top - st_scroll.rtDrag.bottom;MoveRect(st_scroll.rtDrag,0,st_scroll.nMove);InvalidateRect(hwnd,&st_scroll.rtScl,false); } break; case DRAG: yDown = HIWORD(lParam); st_scroll.bLeftDown = true; break; default: break; } }  //2、不在控件上 else {//在拖动条上方空白区单击 if (y < st_scroll.rtDrag.top) { if (st_scroll.rtDrag.top > st_scroll.rtUp.bottom) {if (st_scroll.rtDrag.top - st_scroll.nMove>= st_scroll.rtUp.bottom)st_scroll.nMove = st_scroll.rtUp.bottom;MoveRect(st_scroll.rtDrag,0,-st_scroll.nMove);InvalidateRect(hwnd,&st_scroll.rtScl,false); } }//在拖动条下方空白区单击 else { if (st_scroll.rtDrag.bottom <= st_scroll.rtDown.top) {if (st_scroll.rtDrag.bottom+st_scroll.nMove>= st_scroll.rtDown.top)st_scroll.nMove = st_scroll.rtDown.top - st_scroll.rtDrag.bottom;MoveRect(st_scroll.rtDrag,0,st_scroll.nMove);InvalidateRect(hwnd,&st_scroll.rtScl,false); } } } /*st_scroll.iMove += st_scroll.nMove; if ()*///同步更新 st_scroll.rtScrollst_scroll.rtScroll[1] = st_scroll.rtDrag;}//移动一个矩形void MoveRect(RECT& rt, int cx, int cy){rt.left += cx;rt.right  += cx;rt.top  += cy;rt.bottom  += cy;}//处理滚动条鼠标动作void MouseDrag(HWND hwnd, LPARAM lParam,  int& yDown){ //拖动 int id,xMov,yMov,yDrag; if (st_scroll.bLeftDown) { xMov = LOWORD(lParam); yMov = HIWORD(lParam); id = ::GetMouInScllCtrId(xMov, yMov); if (id != DRAG) return; yDrag = yMov - yDown; //向下拖动 if (yDrag > 0) { if (st_scroll.rtDrag.bottom <= st_scroll.rtDown.top) {if (st_scroll.rtDrag.bottom+yDrag> st_scroll.rtDown.top)yDrag = st_scroll.rtDown.top - st_scroll.rtDrag.bottom;MoveRect(st_scroll.rtDrag,0,yDrag);InvalidateRect(hwnd,&st_scroll.rtScl,false); } } //向上拖动 if (yDrag < 0) { if (st_scroll.rtDrag.top >= st_scroll.rtUp.bottom) {if (st_scroll.rtDrag.top + yDrag < st_scroll.rtUp.bottom)yDrag = st_scroll.rtUp.bottom - st_scroll.rtDrag.top;MoveRect(st_scroll.rtDrag,0,yDrag);InvalidateRect(hwnd,&st_scroll.rtScl,false); } } //滚动音乐窗口 }//同步更新 st_scroll.rtScrollst_scroll.rtScroll[1] = st_scroll.rtDrag;}//鼠标移动处理void MouseMove(HWND hwnd, LPARAM lParam){ int id; int x,y; x = LOWORD(lParam); y = HIWORD(lParam); id = ::GetMouInScllCtrId(x, y); //判断鼠标是否在控件上 //1、在控件上 if (-1 != id) { //1.1 处理左键单击 switch(id)  { case UP: if (-1 == lastmouseIn) lastmouseIn = UP; st_scroll.color[0] = RGB(40, 40, 220); st_scroll.color[1] = RGB(50, 50, 200); st_scroll.mouseIn[UP] = UP; OnlyMe(st_scroll.mouseIn,SCROLL,UP); break; case DOWN: if (-1 == lastmouseIn) lastmouseIn = DOWN; st_scroll.color[3] = RGB(40, 40, 220); st_scroll.color[4] = RGB(50, 50, 200); st_scroll.mouseIn[DOWN] = DOWN; OnlyMe(st_scroll.mouseIn,SCROLL,DOWN); break; case DRAG: if (-1 == lastmouseIn) lastmouseIn = DRAG;     st_scroll.color[2] = RGB(40, 40, 100); st_scroll.mouseIn[DRAG] = DRAG; OnlyMe(st_scroll.mouseIn,SCROLL,DRAG); break; default:     InvalidateRect(hwnd,&st_scroll.rtScl,1); break; } } //离开控件if (-1 != lastmouseIn && id != lastmouseIn){switch (lastmouseIn){case UP: st_scroll.color[0] = RGB(20, 20, 220); st_scroll.color[1] = RGB(50, 50, 150);break;case DRAG: st_scroll.color[3] = RGB(20, 20, 220); st_scroll.color[4] = RGB(50, 50, 200);break;case DOWN:     st_scroll.color[2] = RGB(20, 20, 100);break;default:break;}InvalidateRect(hwnd,&st_scroll.rtScl,false);lastmouseIn = -1; }}//初始化音乐列表void InitMus(int x, int y){memset(&st_mus.mus,0,sizeof(st_mus.mus));st_mus.mus_lis.nItem = 10;st_mus.mus_lis.ptList.x = 0;st_mus.mus_lis.ptList.y = 0;st_mus.mus_lis.siItem.cx = x;st_mus.mus_lis.siItem.cy = y / 10;st_mus.mus_lis.hList = NULL;//记得free,改变nItem时记得重新分配st_mus.mus_lis.playnFlag = (bool*)malloc(sizeof(bool) * st_mus.mus_lis.nItem);memset(st_mus.mus_lis.playnFlag,0,sizeof(bool)*st_mus.mus_lis.nItem);st_mus.mus_lis.deletnFlag  = (bool*)malloc(sizeof(bool) * st_mus.mus_lis.nItem);memset(st_mus.mus_lis.deletnFlag,0,sizeof(bool)*st_mus.mus_lis.nItem);}//画音乐列表int DrawMusicList(HDC hdc, MUSIC_LIST mlt, COLORREF colorRgn, COLORREF colorLine,COLORREF colorBk){//创建兼容dcHDC mdc = CreateCompatibleDC(hdc);  HBITMAP hMemBmp = ::CreateCompatibleBitmap (hdc,mlt.ptList.x + mlt.siItem.cx, mlt.ptList.y + mlt.nItem * mlt.siItem.cy);SelectObject(mdc, hMemBmp);HBRUSH hr;hr = CreateSolidBrush(colorBk);SelectObject(mdc, hr);RECT listRt;listRt.left = mlt.ptList.x;listRt.top  = mlt.ptList.y;listRt.right = mlt.ptList.x + mlt.siItem.cx - st_scroll.w;listRt.bottom = mlt.ptList.y + mlt.nItem * mlt.siItem.cy;FillRect(mdc,&listRt,hr);  //画列表/////////////////////////////////////////////////////#define A#ifdef A//DOTO:draw int the memDC//画列表项int i;for (i = 0; i < mlt.nItem; ++i){RECT rt ;rt.left= mlt.ptList.x ;rt.top = mlt.ptList.y ;rt.right= mlt.ptList.x + mlt.siItem.cx  ;rt.bottom = mlt.ptList.y + mlt.siItem.cy  ;//画播放项矩形MoveRect(rt,0,i * (mlt.siItem.cy));::DrawRectangle (mdc,colorRgn,colorLine,rt);//画播放按钮POINT pt[3] = {{rt.left +mlt.siItem.cy/2 + mlt.siItem.cy,rt.top+mlt.siItem.cy/4},{rt.left+mlt.siItem.cy,rt.top},{rt.left+mlt.siItem.cy,rt.top+mlt.siItem.cy/2},};if (!mlt.playnFlag[i]){::DrawTriangle(mdc,RGB(80,150,100),RGB(80,150,100),pt[0],pt[1],pt[2]);}else{::DrawTriangle(mdc,RGB(0,0,200),RGB(0,0,200),pt[0],pt[1],pt[2]);}//画删除按钮RECT rc;rc.left = rt.left;rc.top = rt.top;rc.right = rt.left + mlt.siItem.cy / 2;rc.bottom  = rt.top + mlt.siItem.cy / 2;if (!mlt.deletnFlag[i]){::DrawRectangle (mdc,RGB(80,150,100),RGB(80,150,100),rc);}else{::DrawRectangle (mdc,RGB(255,0,0),RGB(255,0,0),rc);}}#endif////////////////////////////////////////////////////////////////将mdc内容贴到hdc上    BitBlt (hdc, listRt.left, listRt.top ,listRt.right - listRt.left,listRt.bottom - listRt.top ,  mdc, 0, 0, SRCCOPY) ;DeleteObject(hMemBmp);DeleteObject(hr);return 1;}//打开文件窗口回调函数LRESULT CALLBACK OpenFileWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {     HDC         hdc ;     PAINTSTRUCT ps ; TRACKMOUSEEVENT tme; static RECT rt; ZeroMemory(&tme, sizeof(tme));     switch (message)     {     case WM_CREATE:return 0 ; case WM_SIZE:     return 0;     case WM_PAINT:          hdc = BeginPaint (hwnd, &ps) ;  GetClientRect(hwnd,&rt);          EndPaint (hwnd, &ps) ;          return 0 ;case WM_LBUTTONDOWN://浏览并加载MP3文件并保存到指定文件BrowseFolder(EnumerateFolder,fname);::InvalidateRect (st_mus.mus_lis .hList,NULL,false);return 0 ; case WM_MOUSEMOVE://追踪鼠标 if( !bMouseTracking )  {  tme.cbSize = sizeof(TRACKMOUSEEVENT);  tme.dwFlags = TME_LEAVE;  tme.hwndTrack = hwnd;   tme.dwHoverTime = 0;TrackMouseEvent(&tme); bMouseTracking = true; }hdc = GetDC(hwnd);::DrawRectangle (hdc,RGB(0,255,0),RGB(0,255,0),rt);ReleaseDC(hwnd,hdc);return 0 ;     //处理WM_MOUSELEAVE,鼠标离开窗口会出发此消息case WM_MOUSELEAVE: hdc = GetDC(hwnd); ::DrawRectangle (hdc,RGB(100,50,150),RGB(100,50,150),rt); ReleaseDC(hwnd,hdc);return 0;case WM_ERASEBKGND :SetCtlColor(RGB(100,50,150),wParam, hwnd);case WM_KEYUP:return 0 ;    case WM_DESTROY:        DestroyWindow(hwnd);        return 0 ;     }     return DefWindowProc (hwnd, message, wParam, lParam) ;}bool EnumerateFolder(LPCTSTR lpcszFolder, int nLevel,FILE* fp, LPCTSTR fname){    WIN32_FIND_DATA ffd;    TCHAR szDir[MAX_PATH];TCHAR szRootDir[MAX_PATH] = {0};    HANDLE hFind = INVALID_HANDLE_VALUE;     StringCchCopy(szDir, MAX_PATH, lpcszFolder);StringCchCopy(szRootDir, MAX_PATH, szDir);StringCchCat(szRootDir, MAX_PATH, TEXT("\\"));    StringCchCat(szDir, MAX_PATH, TEXT("\\*.mp3"));         // Find the first file in the directory.         hFind = FindFirstFile(szDir, &ffd);         if (INVALID_HANDLE_VALUE == hFind)     {        return false;    }          // List all the files in the directory with some info about them.     TCHAR szOutLine[MAX_PATH] = {0};    for (int ii = 0; ii < nLevel; ++ii)        szOutLine[ii] = L'\t';         do    {        if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)        {            if ( L'.' != ffd.cFileName[0] )            {                wprintf(TEXT("%s%s   <DIR>\n"), szOutLine, ffd.cFileName);                StringCchCopy(szDir+wcslen(lpcszFolder)+1, MAX_PATH, ffd.cFileName);                 EnumerateFolder(szDir, nLevel+1,fp,fname);   // recursion here            }        }        else        {//以二进制方式写入一个文本文件fp=_wfopen(fname,TEXT("a"));if (NULL == fp){fp = _wfopen(fname,TEXT("w"));if (fp == NULL){return false;}}MUSIC musc;::ZeroMemory (&musc, sizeof(MUSIC));TCHAR szMusDir[MAX_PATH] = {0};StringCchCopy(szMusDir, MAX_PATH, szRootDir);StringCchCat(szMusDir, MAX_PATH, ffd.cFileName);StringCchCopy(musc.szDir, MAX_PATH, szMusDir);//musc.szName = strNotchar(ffd.cFileName, '.');wchar_t* q = ffd.cFileName;wchar_t* p = ::wcschr(ffd.cFileName,'.');StringCchCopy(musc.szName, p-q, ffd.cFileName);//StringCchCat(szMusDir, MAX_PATH, TEXT("\r\n"));fwrite(&musc,sizeof(musc),1,fp);//按字节写fclose(fp);            wprintf(TEXT("%s%s\n"), szOutLine, ffd.cFileName);        }    }    while (FindNextFile(hFind, &ffd) != 0);     FindClose(hFind);    return true;}//浏览系统文件bool BrowseFolder(bool (*fn)(LPCTSTR,int,FILE*,LPCTSTR),LPCTSTR fname){ TCHAR szPathName[MAX_PATH]; ::ZeroMemory (szPathName,sizeof(szPathName)); BROWSEINFO bInfo; ::ZeroMemory (&bInfo,sizeof(bInfo));   bInfo.hwndOwner=GetForegroundWindow();//父窗口   bInfo.lpszTitle=TEXT("浏览文件夹");   bInfo.ulFlags=BIF_RETURNONLYFSDIRS |BIF_USENEWUI/*包含一个编辑框 用户可以手动填写路径 对话框可以调整大小之类的..*/|    BIF_UAHINT/*带TIPS提示*/ |BIF_NONEWFOLDERBUTTON /*不带新建文件夹按钮*/;   //关于更多的 ulFlags 参考 http://msdn.microsoft.com/en-us/library/bb773205(v=vs.85).aspx   LPITEMIDLIST lpDlist;   lpDlist=SHBrowseForFolder(&bInfo);   if (lpDlist!=NULL)//单击了确定按钮   {    SHGetPathFromIDList(lpDlist,szPathName);  //执行函数fn  FILE* fp = NULL;  fn(szPathName,0,fp,fname);  return true; }return false;}void IntSql(){//销毁窗口时 ::CoUninitialize();::CoInitialize (NULL);  try{//创建Connection这个COM对象st_mus.mus.m_pConnection .CreateInstance (_uuidof(Connection));//连接Connection这个COM对象st_mus.mus.m_pConnection->Open("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=YAZHENGWEI;Initial Catalog=xiaoya;Data Source=YAZHENGWEI", "", "",-1);   //连接SQL SERVER 2008}catch(_com_error e){TCHAR sErr[50];::wsprintf (sErr,L"连接数据库失败!\r\n错误信息:%s",e.ErrorMessage ());MessageBox(NULL,sErr,NULL,1);}//创建记录集这个COM对象st_mus.mus.m_pRecordSet.CreateInstance (_uuidof(Recordset));//执行查询,得到结果集于m_pRecordSet中st_mus.mus.m_pRecordSet->Open ("select * from stu_info",st_mus.mus.m_pConnection.GetInterfacePtr (),adOpenDynamic,adLockOptimistic,adCmdText);//移动到结果集德第一条记录处st_mus.mus.m_pRecordSet ->MoveFirst ();}


0 0
原创粉丝点击