window编程 - 俄罗斯方块
2015-09-30 08:53
363 查看
#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){ // 背景1 SelectObject(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; // 底边框 3 if (pos_x + BOXSIZE >= GAME_RIGHT) right_state = 1; // 右边框 2 if (pos_x <= GAME_LEFT) left_state = 1; // 左边框 1 if (game_zone[pos_x - BOXSIZE][pos_y] && game_zone[pos_x - BOXSIZE][pos_y + BOXSIZE]) // 左块边界 11 block_state_left = 1; if (game_zone[pos_x + BOXSIZE][pos_y] && game_zone[pos_x + BOXSIZE][pos_y + BOXSIZE]) // 右块边界 12 block_state_right = 1; if (game_zone[pos_x][pos_y + BOXSIZE]) // 下块边界 13 block_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); } }
相关文章推荐
- VSftp
- java执行字符串中的运算公式
- Unix环境编程学习笔记---------打开并查看系统调用表
- Java堆/栈/常量池以及String的详细详解(转)------经典易懂系统
- 十分钟学会 Python
- test9.1
- 如何在Mac OS X上安装 Ruby运行环境
- python 实现文件复制,删除
- 学习日志---本地javaApi连接集群hdfs
- 《Python基础教程 (第2版 修订版)》 第2章 列表和元组(学习笔记· 一)
- Xcode:添加自定义代码块
- java应用fullgc时如何排查问题
- [置顶] Spring+Mybatis+SpringMVC+Maven+MySql搭建实例
- spring+springmvc+mybatis+maven搭建的框架项目
- 当虚函数遇到多继承
- C++的动态内存分配
- 用C#.NET 与Webdriver写的抓取网页信息的小工具
- Spring 配置文件报错 springmvc.xml
- C#如何分割有IP+端口的字符串?
- 关于在VB.NET中调用使用VC++编写的类库dll的一点笔记