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
- C语言+windows API仿写类酷狗播放器(1)
- C语言课程设计-Mp3播放器(1)
- Windows下c语言串口的编写(利用API)
- C语言使用windows api实现多线程
- c语言MP3播放器
- C语言课程设计-MP3播放器(2)
- 科研办主任篇——重温C语言(1) 位、字节、字;我们要用windows api
- C语言制作简谱播放器
- C语言播放音乐(DOS)
- C语言播放视频
- C语言播放音乐
- c语言播放音乐
- 定时关机程序(恶搞版)---通过VC6.0+C语言+windows API实现
- C语言与Windows API编程!有无同路人?
- C语言利用Windows api创建文件打开对话框模板
- windows 下VLC播放器应用之二------LIBVLC API解析(二)
- windows 下VLC播放器应用之二------LIBVLC API解析(四)
- libEasyPlayer RTSP windows播放器SDK API接口设计说明
- lucene4.7 分词器 自定义分词器
- 国内有哪些质量高的JAVA社区?
- ZIGBEE:第一个实验:无线温度传感器实验
- oracle 数据类型详解---日期型
- uboot中DTS相关处理(1 )
- C语言+windows API仿写类酷狗播放器(1)
- android开发之在activity中控制另一个activity的UI更新
- C/C++中float和double的存储结构
- MFC控件显示Mat图像
- java环境配置基础知识
- Sprite精灵类的创建与设置
- 原木时尚情怀 打造简约个性小复式
- svn E205007
- recovery的基本流程