window编程 - 俄罗斯方块

来源:互联网 发布:vb表格怎么设置滚动条 编辑:程序博客网 时间:2024/06/07 16:37
#include <windows.h>#include <time.h>#include "resource.h"#include "mmsystem.h"#pragma comment(lib,"winmm.lib")#define BOXSIZE      10             // 单个方块大小#define WIN_WIDTH    645            // 窗口宽度#define WIN_LENGTH   648            // 窗口长度#define GAME_LEFT    10             // 游戏区域的左部#define GAME_RIGHT   510            // 游戏区域的右部#define GAME_TOP     0              // 游戏区域的顶部#define GAME_BUT     600            // 游戏区域的底部#define HINT_EDGE    150            // 提示区域边界#define LINE_SCORE   100            // 每消一个加100分// 全局变量const POINT Tetris[7][4][4] = {{// |一{ { 250, 0 }, { 260, 0 }, { 270, 0 }, { 280, 0 } },{ { 250, 0 }, { 250, 10 }, { 250, 20 }, { 250, 30 } },{ { 250, 0 }, { 260, 0 }, { 270, 0 }, { 280, 0 } },{ { 250, 0 }, { 250, 10 }, { 250, 20 }, { 250, 30 } },},{// 田{ { 250, 0 }, { 260, 0 }, { 250, 10 }, { 260, 10 } },{ { 250, 0 }, { 260, 0 }, { 250, 10 }, { 260, 10 } },{ { 250, 0 }, { 260, 0 }, { 250, 10 }, { 260, 10 } },{ { 250, 0 }, { 260, 0 }, { 250, 10 }, { 260, 10 } },},{// L{ { 250, 0 }, { 250, 10 }, { 250, 20 }, { 260, 20 } },{ { 250, 0 }, { 250, 10 }, { 260, 0 }, { 270, 0 } },{ { 250, 0 }, { 260, 0 }, { 260, 10 }, { 260, 20 } },{ { 250, 10 }, { 260, 10 }, { 270, 10 }, { 270, 0 } },},{// ~L{ { 250, 20 }, { 260, 0 }, { 260, 10 }, { 260, 20 } },{ { 250, 0 }, { 250, 10 }, { 260, 10 }, { 270, 10 } },{ { 250, 0 }, { 250, 10 }, { 250, 20 }, { 260, 0 } },{ { 250, 0 }, { 260, 0 }, { 270, 0 }, { 270, 10 } },},{// Z N{ { 250, 0 }, { 260, 0 }, { 260, 10 }, { 270, 10 } },{ { 250, 10 }, { 250, 20 }, { 260, 0 }, { 260, 10 } },{ { 250, 0 }, { 260, 0 }, { 260, 10 }, { 270, 10 } },{ { 250, 10 }, { 250, 20 }, { 260, 0 }, { 260, 10 } },},{// ~Z{ { 250, 10 }, { 260, 0 }, { 260, 10 }, { 270, 0 } },{ { 250, 0 }, { 250, 10 }, { 260, 10 }, { 260, 20 } },{ { 250, 10 }, { 260, 0 }, { 260, 10 }, { 270, 0 } },{ { 250, 0 }, { 250, 10 }, { 260, 10 }, { 260, 20 } },},{ // { { 250, 10 }, { 260, 0 }, { 260, 10 }, { 270, 10 } },{ { 250, 0 }, { 250, 10 }, { 250, 20 }, { 260, 10 } },{ { 250, 0 }, { 260, 0 }, { 270, 0 }, { 260, 10 } },{ { 250, 10 }, { 260, 0 }, { 260, 10 }, { 260, 20 } },},};static int left_state = 0, right_state = 0, buttom_state = 0;static int block_state_but = 0, block_state_right = 0, block_state_left = 0;static int now_color = 0, now_shape = 0, now_dir = 0;                 // 当前方向static int next_shape = 0, next_color = 0, next_dir = 0;                    // 下一次static POINT now_block[4];                      // 当前方块static HBRUSH gcolor[5];                        // 颜色static int   game_zone[GAME_RIGHT][GAME_BUT];   // 游戏区static int   over_state = 0, pause_state = 0;   // 结束、暂停标志HWND hwndEdit1;             // 分数HWND hwndEdit2;             // 等级HWND hwndEdit3;             // 游戏时间HWND hwndEdit4, hwndEdit5, hwndEdit6, hwndEdit7, hwndEdit8, hwndEdit9;             // 操作指南HWND hwndBut1, hwndBut2, hwndBut3;TCHAR buffer[100];static int ghighest = 99999;static int score = 0;                           // 分数static int degree = 7;                           // 等级static int game_time = 0;                           // 游戏时间const int degree_score[7] = { 2000, 5000, 10000, 17000, 26000, 37000, 50000 }; // 晋级分数int gspeed[8] = { 600, 500, 400, 300, 200, 100, 50, 20 };int most_speed = 5;// 函数声明LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);  // 回调函数void DrawBackground(HDC hdc);                          // 画背景void DrawBox(HDC hdc, int x, int y, int color);        // 画小方块void DrawBlocks(HDC hdc, POINT bs[], int color);       // 画大方块void Init(HWND, HINSTANCE);                            // 初始化void SetColor();                                       // 设置颜色void GetNext(HDC);                                     // 获取下一个void IsBlocked(POINT now_block[4]);                    // 判断是否被挡住void Save();                                           // 保存位置void Rander(HDC hdc);                                  // 游戏区域测试void Game_over(HDC, HWND);                             // 检测游戏是否结束void Fall(HWND hwnd, HDC hdc);                         // 下落void ShowGameZone(HDC);                                // 显示方块落下的区域void ShowGameStatus(HWND);                             // 显示游戏进行的状态void PlayMusic(HWND hwnd, LPCWSTR type, LPCWSTR name); // 实现不同格式音乐的播放// 主函数int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){HWND hwnd;MSG  msg;WNDCLASS wndcls;TCHAR szAppName[] = L"Win32";wndcls.style = CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE;wndcls.cbClsExtra = 0;wndcls.cbWndExtra = 0;wndcls.lpfnWndProc = WinProc;wndcls.hInstance = hInstance;wndcls.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));wndcls.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));wndcls.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));wndcls.lpszClassName = szAppName;wndcls.lpszMenuName = NULL;if (!RegisterClass(&wndcls)){MessageBox(NULL, L"注册窗口失败,此程序必须在Windows环境下运行!", L"hint", MB_ICONHAND);return 0;}hwnd = CreateWindow(szAppName,TEXT("俄罗斯方块"),WS_OVERLAPPEDWINDOW&~WS_MAXIMIZEBOX^WS_THICKFRAME,10, 10, WIN_WIDTH, WIN_LENGTH, NULL,NULL,        // 菜单hInstance, NULL);ShowWindow(hwnd, iCmdShow);UpdateWindow(hwnd);while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return static_cast<int>(msg.wParam);}// 回调函数LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){HDC hdc;PAINTSTRUCT ps;static HINSTANCE hInstance;RECT rect;static int music = 0;switch (message){case WM_CREATE:Init(hwnd, hInstance);                       // 初始化SetTimer(hwnd, 1, gspeed[degree], NULL);     // 设置时钟SetTimer(hwnd, 2, 1000, NULL);               // 游戏时间PlayMusic(hwnd, L"mpegvideo", L"music.mp3");//MessageBox(hwnd, L"窗口正在创建", L"Tips", MB_OK);return 0;case WM_PAINT:hdc = BeginPaint(hwnd, &ps);DrawBackground(hdc);          // 画背景Rander(hdc);EndPaint(hwnd, &ps);return 0;case MM_MCINOTIFY:if (music == 0){PlayMusic(hwnd, L"mpegvideo", L"snow_journey.mid");music = 1;}else if (music == 1){music = 0;PlayMusic(hwnd, L"mpegvideo", L"chocobo1.mid");}return 0;case WM_COMMAND:{hdc = GetDC(hwnd);switch (LOWORD(wParam)){case 4:{    // 新游戏   KillTimer(hwnd, 1);   int sel = MessageBox(hwnd, TEXT("是否开始新游戏?"), L"新游戏", MB_ICONQUESTION | MB_OKCANCEL);   if (sel == IDOK){   GetClientRect(hwnd, &rect);   Init(hwnd, hInstance);   SetTimer(hwnd, 1, gspeed[degree], NULL);   GetNext(hdc);   InvalidateRect(hwnd, &rect, TRUE);   }   else{   SetTimer(hwnd, 1, gspeed[degree], NULL);;   SetFocus(hwnd);   }}break;case 5:{    // 暂停   if (pause_state == 0){   pause_state = 1;   SetDlgItemText(hwnd, 5, L"继    续");   KillTimer(hwnd, 1);   }   else if (pause_state == 1){   pause_state = 0;   SetDlgItemText(hwnd, 5, L"暂    停");   SetTimer(hwnd, 1, gspeed[degree], NULL);   SetFocus(hwnd);   }}break;case 6:{    // 退出   KillTimer(hwnd, 1);   if (IDOK == MessageBox(hwnd, L"退出游戏?", L"退出",   MB_ICONINFORMATION | MB_OKCANCEL)){   PostQuitMessage(0);   }   else {   SetTimer(hwnd, 1, gspeed[degree], NULL);   // SetFocus(hwnd);   }}break;}ReleaseDC(hwnd, hdc);}return 0;case WM_KEYDOWN: // 按键处理{ hdc = GetDC(hwnd); IsBlocked(now_block); switch (wParam){ case VK_LEFT:// 左箭头 if (!left_state && !block_state_left && !buttom_state && !block_state_but){ DrawBlocks(hdc, now_block, 3); for (int i = 0; i < 4; i++) now_block[i].x -= BOXSIZE; DrawBlocks(hdc, now_block, now_color); } break; case VK_RIGHT:// 右箭头 if (!right_state && !block_state_but && !buttom_state && !block_state_right){ DrawBlocks(hdc, now_block, 3); for (int i = 0; i < 4; i++) now_block[i].x += BOXSIZE; DrawBlocks(hdc, now_block, now_color); }break; case VK_SPACE:{// 空格   POINT new_block[4];   int new_dir = (now_dir + 1) % 4;   int offset_y = now_block[0].y - Tetris[now_shape][now_dir][0].y;   int offset_x = now_block[0].x - Tetris[now_shape][now_dir][0].x;   for (int i = 0; i < 4; i++){   new_block[i].x = Tetris[now_shape][new_dir][i].x + offset_x;   new_block[i].y = Tetris[now_shape][new_dir][i].y + offset_y;   }   IsBlocked(new_block);   if (!buttom_state && !block_state_but && !block_state_right && !right_state){   DrawBlocks(hdc, now_block, 3);   for (int i = 0; i < 4; i++) now_block[i] = new_block[i];   now_dir = new_dir;   DrawBlocks(hdc, now_block, now_color);   } }break; case VK_DOWN:// 下箭头 SetTimer(hwnd, 1, 5, NULL); break; case VK_UP: // 上箭头 SetTimer(hwnd, 1, gspeed[degree], NULL); break; } ReleaseDC(hwnd, hdc);}return 0;case WM_TIMER:// 计时器处理switch (wParam){case 1:{   ShowGameStatus(hwnd);   hdc = GetDC(hwnd);   IsBlocked(now_block);   if (!buttom_state && !block_state_but){   // 如果没有碰到窗口底部或块底部   DrawBlocks(hdc, now_block, 3);        // 覆盖先前的   for (int i = 0; i < 4; i++){   now_block[i].y += BOXSIZE;        // 画出移动后的   }   DrawBlocks(hdc, now_block, now_color);   }   else{   PlaySound(L"Falldown.wav", NULL, SND_FILENAME);   Save();   DrawBlocks(hdc, now_block, now_color);   Fall(hwnd, hdc);   Game_over(hdc, hwnd);   Rander(hdc);   GetNext(hdc);   SetTimer(hwnd, 1, gspeed[degree], NULL);   }   ReleaseDC(hwnd, hdc);}break;case 2:game_time++;break;}return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);}// 设置void SetColor(){gcolor[0] = CreateSolidBrush(RGB(255, rand() % 127, rand() % 127));gcolor[1] = CreateSolidBrush(RGB(rand() % 127, 255, rand() % 127));gcolor[2] = CreateSolidBrush(RGB(rand() % 127, rand() % 127, 255));gcolor[4] = CreateSolidBrush(RGB(rand() % 127, rand() % 127, rand() % 127));if (now_color == 3) now_color = 0;}// 初始化void Init(HWND hwnd, HINSTANCE hInstance){gcolor[3] = CreateSolidBrush(RGB(0, 0, 0));             // 黑色SetColor();                                             // 设置其它颜色srand((unsigned)time(0));score = 0;degree = 0;// 初始化方块状态next_shape = rand() % 7;next_dir = rand() % 4;next_color = rand() % 5;if (next_color == 3) next_color = 0;hwndEdit1 = CreateWindow(TEXT("EDIT"), L"分数:0", WS_CHILD | WS_VISIBLE | ES_READONLY,GAME_RIGHT + BOXSIZE + 2, HINT_EDGE + BOXSIZE + 2, 105, 20, hwnd, (HMENU)1, hInstance, NULL);hwndEdit2 = CreateWindow(TEXT("EDIT"), L"等级:0", WS_CHILD | WS_VISIBLE | ES_READONLY,GAME_RIGHT + BOXSIZE + 2, HINT_EDGE + BOXSIZE + 2 + 40 + 5, 105, 20, hwnd, (HMENU)2, hInstance, NULL);hwndEdit3 = CreateWindow(TEXT("EDIT"), L"游戏时间:0", WS_CHILD | WS_VISIBLE | ES_READONLY,GAME_RIGHT + BOXSIZE + 2, HINT_EDGE + BOXSIZE + 2 + 80 + 10, 105, 20, hwnd, (HMENU)3, hInstance, NULL);hwndBut1 = CreateWindow(TEXT("BUTTON"), L"新 游 戏", WS_CHILD | WS_VISIBLE,GAME_RIGHT + BOXSIZE + 2, HINT_EDGE + BOXSIZE + 2 + 120 + 20, 105, 30, hwnd, (HMENU)4, hInstance, NULL);hwndBut2 = CreateWindow(TEXT("BUTTON"), L"暂    停", WS_CHILD | WS_VISIBLE,GAME_RIGHT + BOXSIZE + 2, HINT_EDGE + BOXSIZE + 2 + 160 + 20, 105, 30, hwnd, (HMENU)5, hInstance, NULL);hwndBut2 = CreateWindow(TEXT("BUTTON"), L"退    出", WS_CHILD | WS_VISIBLE,GAME_RIGHT + BOXSIZE + 2, HINT_EDGE + BOXSIZE + 2 + 200 + 20, 105, 30, hwnd, (HMENU)6, hInstance, NULL);hwndEdit4 = CreateWindow(TEXT("EDIT"), TEXT("← move left"), WS_CHILD | WS_VISIBLE | ES_READONLY,GAME_RIGHT + BOXSIZE + 2, HINT_EDGE + BOXSIZE + 2 + 280 + 20, 105, 20, hwnd, (HMENU)7, hInstance, NULL);hwndEdit5 = CreateWindow(TEXT("EDIT"), TEXT("→ move right"), WS_CHILD | WS_VISIBLE | ES_READONLY,GAME_RIGHT + BOXSIZE + 2, HINT_EDGE + BOXSIZE + 2 + 300 + 20, 105, 20, hwnd, (HMENU)8, hInstance, NULL);hwndEdit6 = CreateWindow(TEXT("EDIT"), TEXT("↑ speed down"), WS_CHILD | WS_VISIBLE | ES_READONLY,GAME_RIGHT + BOXSIZE + 2, HINT_EDGE + BOXSIZE + 2 + 320 + 20, 105, 20, hwnd, (HMENU)9, hInstance, NULL);hwndEdit7 = CreateWindow(TEXT("EDIT"), TEXT("↓ speed up"), WS_CHILD | WS_VISIBLE | ES_READONLY,GAME_RIGHT + BOXSIZE + 2, HINT_EDGE + BOXSIZE + 2 + 340 + 20, 105, 20, hwnd, (HMENU)10, hInstance, NULL);hwndEdit8 = CreateWindow(TEXT("EDIT"), TEXT("SPACE change"), WS_CHILD | WS_VISIBLE | ES_READONLY,GAME_RIGHT + BOXSIZE + 2, HINT_EDGE + BOXSIZE + 2 + 360 + 20, 105, 20, hwnd, (HMENU)11, hInstance, NULL);// 设置游戏区域for (int i = 0; i < GAME_RIGHT; i++){for (int j = 0; j < GAME_BUT; j++)game_zone[i][j] = 0;}for (int i = 0; i < BOXSIZE; i++){for (int j = 0; j < GAME_BUT; j++){game_zone[i][j] = 1;}}for (int i = GAME_BUT; i < GAME_BUT + BOXSIZE; i++){for (int j = 0; j < GAME_RIGHT; j++)game_zone[i][j] = 1;}}// 设置背景void DrawBackground(HDC hdc){// 背景1SelectObject(hdc, gcolor[3]);Rectangle(hdc, GAME_LEFT, 0, GAME_RIGHT, GAME_BUT);Rectangle(hdc, GAME_RIGHT, 0, WIN_WIDTH, HINT_EDGE);SelectObject(hdc, gcolor[1]);Rectangle(hdc, GAME_RIGHT, HINT_EDGE, WIN_WIDTH, WIN_LENGTH);// 背景2 - 长条边界for (int i = 0; i <= GAME_BUT; i += 10){DrawBox(hdc, 0, i, 0);DrawBox(hdc, GAME_RIGHT, i, 0);}for (int i = 10; i < GAME_RIGHT; i += 10)DrawBox(hdc, i, GAME_BUT, 0);for (int i = GAME_RIGHT; i < WIN_WIDTH; i += 10)DrawBox(hdc, i, HINT_EDGE, 0);}// 画小方块void  DrawBox(HDC hdc, int x, int y, int color){SelectObject(hdc, gcolor[color]);Rectangle(hdc, x, y, x + BOXSIZE, y + BOXSIZE);}// 画一个大方块void DrawBlocks(HDC hdc, POINT bs[], int color){for (int i = 0; i < 4; i++){DrawBox(hdc, bs[i].x, bs[i].y, color);}}// 获取下一个形状void GetNext(HDC hdc){RECT rect;SetRect(&rect, GAME_RIGHT + BOXSIZE, 0, WIN_WIDTH, HINT_EDGE);FillRect(hdc, &rect, gcolor[3]);// 设置新的颜色SetColor();// 更新现在的状态now_color = next_color;now_dir = next_dir;now_shape = next_shape;// 当前方块赋值for (int i = 0; i < 4; i++)now_block[i] = Tetris[now_shape][now_dir][i];// 获取下一状态next_color = rand() % 5;if (next_color == 3)next_color = 0;next_shape = rand() % 2;next_dir = rand() % 4;// 画出下一个for (int i = 0; i < 4; i++)DrawBox(hdc, Tetris[next_shape][next_dir][i].x + 320, Tetris[next_shape][next_dir][i].y + 60, next_color);}// 判断是否被挡住void IsBlocked(POINT now_block[4]){left_state = 0, right_state = 0, buttom_state = 0;block_state_but = 0, block_state_right = 0, block_state_left = 0;int pos_x, pos_y;for (int i = 0; i < 4; i++){pos_x = now_block[i].x;pos_y = now_block[i].y;if (pos_y + BOXSIZE >= GAME_BUT)   buttom_state = 1;                   // 底边框 3if (pos_x + BOXSIZE >= GAME_RIGHT) right_state = 1;                     // 右边框 2if (pos_x <= GAME_LEFT)            left_state = 1;                       // 左边框 1if (game_zone[pos_x - BOXSIZE][pos_y] && game_zone[pos_x - BOXSIZE][pos_y + BOXSIZE])                          // 左块边界 11block_state_left = 1;if (game_zone[pos_x + BOXSIZE][pos_y] && game_zone[pos_x + BOXSIZE][pos_y + BOXSIZE])      // 右块边界 12block_state_right = 1;if (game_zone[pos_x][pos_y + BOXSIZE])                                                     // 下块边界 13block_state_but = 1;}}// 保存落下的方块的位置void Save(){for (int i = 0; i < 4; i++){for (int k = now_block[i].x; k < now_block[i].x + BOXSIZE; k++){for (int j = now_block[i].y; j < now_block[i].y + BOXSIZE; j++)game_zone[k][j] = 1;}}}// 显示有方块的区域void Rander(HDC hdc){for (int i = GAME_LEFT; i < GAME_RIGHT; i += BOXSIZE){for (int j = 0; j < GAME_BUT; j += BOXSIZE){if (game_zone[i][j])DrawBox(hdc, i, j, now_color);// SetPixel(hdc, i, j, RGB(0, 255, 0));else DrawBox(hdc, i, j, 3);}}}// 游戏结束void Game_over(HDC hdc, HWND hwnd){for (int i = 0; i < 4; i++){int x = now_block[i].x, y = now_block[i].y;if (game_zone[x][y] && y == BOXSIZE){over_state = 1;break;}}if (over_state){KillTimer(hwnd, 1);for (int i = GAME_LEFT; i < GAME_RIGHT; i += BOXSIZE){for (int j = 0; j < GAME_BUT; j += BOXSIZE){DrawBox(hdc, i, j, 2);// SetPixel(hdc, i, j, RGB(0, 255, 0));}Sleep(1);}MessageBox(NULL, L"游戏结束!", L"Tips", MB_ICONINFORMATION);PostQuitMessage(0);}}// 当一行全满时,下落void Fall(HWND hwnd, HDC hdc){int lowest = 0, highest = 9999;for (int i = 0; i < 4; i++){    // 找到落下的最低点位置和最高点位置if (now_block[i].y + BOXSIZE >= lowest)  lowest = now_block[i].y + BOXSIZE;if (now_block[i].y <= highest) highest = now_block[i].y;}if (highest < ghighest) ghighest = highest;int line = 0, begin = 0;for (int j = lowest; j >= highest; j -= BOXSIZE){int flag = 0;for (int i = GAME_LEFT; i < GAME_RIGHT; i += BOXSIZE){if (!game_zone[i][j]){flag = 1;break;}}if (!flag){PlaySound(L"Falling.wav", NULL, SND_FILENAME);line++;// 消去该行for (int k = GAME_LEFT; k < GAME_RIGHT; k++){game_zone[k][j] = 0;}Rander(hdc);for (int i = j; i > ghighest - BOXSIZE; i--){for (int k = GAME_LEFT; k < GAME_RIGHT; k++){game_zone[k][i] = game_zone[k][i - BOXSIZE];}}for (int i = ghighest; i<ghighest+BOXSIZE; i++){for (int k = GAME_LEFT; k < GAME_RIGHT; k++){game_zone[k][i] = 0;}}Rander(hdc);}}if (line > 0){if (line == 1) score += 100;else if (line == 2) score += 300;else if (line == 3) score += 600;else if (line == 4) score += 1000;if (degree == 0) degree = 1;wsprintf(buffer, L"分数:%d", score);SetWindowText(hwndEdit1, buffer);if (score >= degree_score[degree]){degree++;wsprintf(buffer, L"等级:%d", degree);SetWindowText(hwnd, buffer);}if (degree == 7){PlaySound(L"success.wav", NULL, SND_FILENAME);MessageBox(hwnd, L"恭喜你成功过关!", L"游戏结束", MB_ICONINFORMATION);over_state = 1;}}}// 显示游戏状态void ShowGameStatus(HWND hwnd){TCHAR buffer[50];wsprintf(buffer, TEXT("分数:%d"), score);SetWindowText(hwndEdit1, buffer);wsprintf(buffer, L"等级:%d", degree);SetWindowText(hwndEdit2, buffer);wsprintf(buffer, TEXT("游戏时间:%ds"), game_time);SetWindowText(hwndEdit3, buffer);}// micSendCommond 来实现不同格式音乐的播放void PlayMusic(HWND hwnd, LPCWSTR type, LPCWSTR name){// 播放音乐MCI_OPEN_PARMS m_mciOpen;MCI_OPEN_PARMS m_mciPlay;m_mciOpen.lpstrDeviceType = type;m_mciOpen.lpstrElementName = name;MCIERROR mcierror = mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&m_mciOpen);if (mcierror){TCHAR buf[128] = { 0 };mciGetErrorString(mcierror, buf, 128);MessageBox(hwnd, buf, NULL, 0);}else{m_mciPlay.dwCallback = (DWORD)hwnd;mciSendCommand(m_mciOpen.wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID)&m_mciPlay);}}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 usb无线网卡坏了怎么办 wifi接收器电脑不识别怎么办 无线路由接收器识别不了怎么办 小米3一直闪红灯怎么办 手机拨号键删了怎么办 联想笔记本电脑无线网卡坏了怎么办 联想z360内置无线网卡坏怎么办 usb无线网卡驱动安装失败怎么办 无线网被禁用了怎么办 未连接无线通信已关闭怎么办 手机设置路由器打不开了怎么办 手机打不开登录路由器的网址怎么办 按了光猫复位后怎么办 按了猫的复位键怎么办 望远镜的镜片小水雾是怎么办 坚果r1不断重启怎么办 忘记Wi-Fi密码了怎么办 魅蓝手机null锁住了怎么办 红米手机锁屏了怎么办 不记得锁屏密码怎么办 小米手机音量键坏了怎么办 小米6音量键坏了怎么办 小米2s开不开机怎么办 小米4不充电了怎么办 小米2开不开机怎么办 手机开机键开不了机怎么办 三星s4反复重启怎么办 小米5反复重启怎么办 电脑系统奔溃了怎么办 电脑开机后屏幕出现英文怎么办 小米4开不开机了怎么办 小米4一直显示mi怎么办 小米手机开关键失灵怎么办 小米手机开机键失灵怎么办 小米6不断重启怎么办 小米6一直重启怎么办 小米6自动重启怎么办 手机的开机键坏了怎么办 小米6频繁重启怎么办 小米6安装xp卡米怎么办 刷机失败反复重启怎么办