導航:首頁 > 版本升級 > loword頭文件

loword頭文件

發布時間:2023-03-26 17:32:34

㈠ 如何用c語言編寫圖形操作的軟體呢

學MFC吧~~你的困惑一下子就會解除的~~~
用純C語言編帶界面的也不是不可能~~就是要用到WINDOWS API~~給你一段代碼試試吧~~是我做的一個OPENGL的程序~~~在VISUAL STUDIO.NET 2003下編譯通過~~代碼如下虛清態~~
#define WM_TOGGLEFULLSCREEN (WM_USER+1) // 定義正信全屏/窗口切換消息
#define TIMER1 101 // 定義時鍾代號,設置為101號
#define TITLE "5DG'S Color Shading" // 定義窗口標題
#define CLASSNAME "5DG_OPENGL" // 定義窗口類名
#define WIDTH 640 // 定義窗口寬度
#define HEIGHT 480 // 定義窗口高度
#define BPP 16 // 定義每象素的位數

#define NUM 200 // 定義繪制圓時用的頂點數(用頂點組成的線段逼近圓)

// 在此處引用程序要求的頭文件:
#include <windows.h> // Windows的頭文件
#include <gl\gl.h> // OpenGL32庫的頭文件
#include <gl\glu.h> // Glu32庫的頭文件
#include <math.h> // 數學函數庫的頭文件

// 在此處加入程序要求的庫到鏈接器中:
#pragma comment(lib, "opengl32.lib") // 鏈接時查找OpenGL32.lib
#pragma comment(lib, "glu32.lib") // 鏈接時查找glu32.lib

// 在此處定義與窗口相關的結構體:
typedef struct { // 定義處理鍵盤的結構體
BOOL keyDown [256]; // 存儲鍵盤按鍵狀態的數組
} Keys;

typedef struct { // 定義存儲應用程序實例的結構體
HINSTANCE hInstance; // 應用程序實例
const char* className; // 應用程序類名
} Application;

typedef struct { // 定義初始化窗口所需信息
Application* application; // 所屬的應用程序
char* title; // 窗口標題
int width; // 窗口寬度
int height; // 窗口高度
int bitsPerPixel; // 每像素的位數
BOOL isFullScreen; // 是否全屏
} GL_WindowInit;

typedef struct { // 定義窗口結構體
Keys* keys; // 鍵盤
HWND hWnd; // 窗口句柄
HDC hDC; // 設備描述表
HGLRC hRC; // 繪制描述表
GL_WindowInit init; // 提供Window初始化信息的結構體
} GL_Window;

// 此代碼模塊中包含的函數的前向聲明:
BOOL Initialize(GL_Window* window, Keys* keys); // 設置你繪制前的初始化值
void DrawSceneGL(void); // 在這里完成場景的繪制
void Update(void); // 在此處更新對消息的動作差源
void Deinitialize(void); // 在此處做退出前掃尾工作

// 在此處定義全局變數:
GL_Window* OGL_window; // 存儲窗口信息
Keys* OGL_keys; // 存儲按鍵信息
// 在此處定義用戶變數:

void ResizeWindowGL(int width, int height) // 重新設置窗口大小
{
glViewport(0, 0, (GLsizei)(width), (GLsizei)(height)); // 重置當前視口大小
glMatrixMode(GL_PROJECTION); // 切換到投影矩陣模式
glLoadIdentity(); // 重置投影矩陣
gluPerspective(45, (float)width/(float)height, 0.1, 100); // 設置透視投影
glMatrixMode(GL_MODELVIEW); // 切換到模型視圖矩陣
glLoadIdentity(); // 重置模型視圖矩陣
}

BOOL ChangeScreenResolution(int width, int height, int bitsPerPixel) // 修改屏幕解析度
{
DEVMODE dmScreenSettings; // 設備設置模式
ZeroMemory(&dmScreenSettings, sizeof(DEVMODE)); // 清空
dmScreenSettings.dmSize = sizeof(DEVMODE); // Devmode結構的大小
dmScreenSettings.dmPelsWidth = width; // 設置為屏幕寬度
dmScreenSettings.dmPelsHeight = height; // 設置為屏幕高度
dmScreenSettings.dmBitsPerPel = bitsPerPixel; // 設為指定位長;
dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
// 嘗試設置顯示模式並返回結果。注: CDS_FULLSCREEN 移去了狀態欄
if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
{
return FALSE; // 解析度修改失敗,返回 False
}
return TRUE; // 解析度修改成功,返回 True;
}

BOOL CreateWindowGL(GL_Window* window) // 建立OpenGL窗口
{
Dword windowStyle = WS_OVERLAPPEDWINDOW; // 設置窗口樣式
DWORD windowExtendedStyle = WS_EX_APPWINDOW; // 設置窗口擴展樣式

PIXELFORMATDESCRIPTOR pfd = // 像素格式描述符(pfd)的設置
{
sizeof(PIXELFORMATDESCRIPTOR), // 像素的尺寸
1, // 版本
PFD_DRAW_TO_WINDOW | // pfd必須支持窗口繪制
PFD_SUPPORT_OPENGL | // pfd必須支持OpenGL
PFD_DOUBLEBUFFER, // pfd必須支持雙緩存
PFD_TYPE_RGBA, // 像素格式為RGBA
window->init.bitsPerPixel, // 設置顏色深度
0, 0, 0, 0, 0, 0, // 忽略顏色位數
0, // 無Alpha緩存
0, // 忽略偏移位
0, // 無累積緩存
0, 0, 0, 0, // 忽略累積緩存位
16, // 深度緩存為16位
0, // 無模板緩存
0, // 無輔助緩存
PFD_MAIN_PLANE, // 主要繪制層
0, // 保留位
0, 0, 0 // 忽略層遮罩
};

RECT windowRect = {0, 0, window->init.width, window->init.height}; // 定義窗口大小

GLuint PixelFormat; // 保存像素格式

if (window->init.isFullScreen == TRUE) // 切換全屏
{
if (ChangeScreenResolution(window->init.width, window->init.height, window->init.bitsPerPixel) == FALSE)
{
// 全屏切換失敗
MessageBox(HWND_DESKTOP, "無法切換到全屏模式,在窗口模式下運行.\nMode Switch Failed,Running In Windowed Mode.", "Error", MB_OK | MB_ICONEXCLAMATION);
window->init.isFullScreen = FALSE; // 設置 isFullscreen 為False
}
else // 全屏切換成功
{
ShowCursor (FALSE); // 隱藏滑鼠
windowStyle = WS_POPUP; // 設置窗口樣式
windowExtendedStyle |= WS_EX_TOPMOST; // 設置窗口擴展樣式
}
}
else
{
// 調整窗口大小,包括窗口邊界
AdjustWindowRectEx(&windowRect, windowStyle, 0, windowExtendedStyle);
}

// 開始創建 OpenGL 窗口
window->hWnd = CreateWindowEx(windowExtendedStyle, // 窗口擴展樣式
window->init.application->className,// 應用程序類名
window->init.title, // 窗口標題
windowStyle, // 窗口樣式
0, 0, // 窗口的 X,Y 坐標位置
windowRect.right - windowRect.left, // 窗口寬度
windowRect.bottom - windowRect.top, // 窗口高度
HWND_DESKTOP, // 父窗口為桌面
0, // 無菜單
window->init.application->hInstance,// 傳入應用程序實例
window);

if (window->hWnd == 0) // 窗口是否成功創建
{
return FALSE; // 若失敗,則返回FALSE
}

window->hDC = GetDC(window->hWnd); // 取得當前窗口的設備描述表
if (window->hDC == 0) // 若未得到設備描述表
{
DestroyWindow(window->hWnd); // 銷毀該窗口
window->hWnd = 0; // 窗口句柄清零
return FALSE; // 返回FALSE
}

PixelFormat = ChoosePixelFormat(window->hDC, &pfd); // 選擇兼容的像素格式
if (PixelFormat == 0) // 若選擇失敗
{
ReleaseDC(window->hWnd, window->hDC); // 釋放設備描述表
window->hDC = 0; // 將設備描述表清零
DestroyWindow(window->hWnd); // 銷毀窗口
window->hWnd = 0; // 窗口句柄清零
return FALSE; // 返回FALSE
}

if (SetPixelFormat(window->hDC, PixelFormat, &pfd) == FALSE) // 設置像素格式並判斷是否失敗
{
ReleaseDC(window->hWnd, window->hDC); // 釋放設備描述表
window->hDC = 0; // 將設備描述表清零
DestroyWindow(window->hWnd); // 銷毀窗口
window->hWnd = 0; // 窗口句柄清零
return FALSE; // 返回FALSE
}

window->hRC = wglCreateContext(window->hDC); // 取得繪制描述表
if (window->hRC == 0) // 若未得到繪制描述表
{
ReleaseDC(window->hWnd, window->hDC); // 釋放設備描述表
window->hDC = 0; // 將設備描述表清零
DestroyWindow(window->hWnd); // 銷毀窗口
window->hWnd = 0; // 窗口句柄清零
return FALSE; // 返回FALSE
}

if (wglMakeCurrent(window->hDC, window->hRC) == FALSE) // 設置繪制描述表並判斷是否失敗
{
wglDeleteContext(window->hRC); // 刪除繪制描述表
window->hRC = 0; // 將繪制描述表清零
ReleaseDC(window->hWnd, window->hDC); // 釋放設備描述表
window->hDC = 0; // 將設備描述表清零
DestroyWindow(window->hWnd); // 銷毀窗口
window->hWnd = 0; // 窗口句柄清零
return FALSE; // 返回FALSE
}

ShowWindow(window->hWnd, SW_NORMAL); // 顯示窗口
ResizeWindowGL(window->init.width, window->init.height); // 重設窗口
ZeroMemory(window->keys, sizeof (Keys)); // 清空鍵盤緩沖區

return TRUE; // 窗口創建成功
}

BOOL DestroyWindowGL(GL_Window* window) // 銷毀窗口並釋放程序所用的資源
{
if (window->hWnd != 0) // 窗口釋放有句柄?
{
if (window->hDC != 0) // 窗口是否有得到繪制描述表?
{
wglMakeCurrent(window->hDC, 0); // 將當前描述表指針置為0
if (window->hRC != 0) // 該窗口是否有繪制描述表
{
wglDeleteContext(window->hRC); // 釋放繪制描述表
window->hRC = 0; // 將繪制描述表清零
}
ReleaseDC(window->hWnd, window->hDC); // 釋放設備描述表
window->hDC = 0; // 將設備描述表清零
}
DestroyWindow(window->hWnd); // 銷毀窗口
window->hWnd = 0; // 將窗口句柄清零
}

if (window->init.isFullScreen) // 若窗口在全屏模式下
{
ChangeDisplaySettings(NULL ,0); // 切換為桌面解析度
ShowCursor(TRUE); // 顯示滑鼠
}
return TRUE; // 返回TRUE
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)// 窗口消息處理
{

GL_Window* window = (GL_Window*)(GetWindowLong(hWnd, GWL_USERDATA));// 取得窗口信息

switch (uMsg) // 取得Window的消息
{
case WM_SYSCOMMAND: // 截取系統命令
{
switch (wParam) // 監聽系統調用
{
case SC_SCREENSAVE: // 要運行屏保?
case SC_MONITORPOWER: // 顯示器進入節電模式?
return 0; // 提前返回0,防止系統調用執行
}
break; // 退出
}

case WM_CREATE: // 創建窗口
{
CREATESTRUCT* creation = (CREATESTRUCT*)(lParam); // 保存窗口結構指針
window = (GL_Window*)(creation->lpCreateParams);
SetWindowLong(hWnd, GWL_USERDATA, (LONG)(window)); // 改變窗口屬性
return 0; // 返回
}

case WM_TIMER: // TIMER事件
{
InvalidateRect(window->hWnd, NULL, FALSE); // 使窗口失效
break;
}

case WM_PAINT: // PAINT消息處理,在此處繪圖
{
DrawSceneGL(); // 在此處繪圖
SwapBuffers(window->hDC); // 交換緩存
ValidateRect(window->hWnd, NULL); // 使窗口有效
break;
}

case WM_CLOSE: // 關閉窗口
{
PostMessage(window->hWnd, WM_QUIT, 0, 0); // 結束程序
return 0;
}

case WM_SIZE: // 窗口大小變化
{
ResizeWindowGL(LOWORD(lParam), HIWORD(lParam)); // 修改窗口大小為 Width = LoWord, Height = HiWord
return 0; // 返回
}

case WM_KEYDOWN: // 按鍵按下時更新鍵盤緩沖
if ((wParam >= 0) && (wParam <= 255)) // 按鍵是否合法?
{
window->keys->keyDown[wParam] = TRUE; // 設相應鍵為 True
return 0; // 返回
}
break; // 退出

case WM_KEYUP: // 按鍵松開時更新鍵盤緩沖
if ((wParam >= 0) && (wParam <= 255)) // 按鍵是否合法?
{
window->keys->keyDown[wParam] = FALSE; // 設相應鍵為為 FALSE
return 0; // 返回
}
break; // 退出

case WM_TOGGLEFULLSCREEN: // 開關全屏模式
{
Deinitialize(); // 做掃尾工作
DestroyWindowGL(window); // 銷毀窗口
window->init.isFullScreen = !window->init.isFullScreen; // 改變窗口模式
CreateWindowGL(window); // 重新創建窗口
Initialize(window, window->keys); // 初始化OpenGL繪製程序
break; // 退出
}

default:
break;
}

return DefWindowProc(hWnd, uMsg, wParam, lParam); // 將本程序不處理的消息傳給 DefWindowProc
}

BOOL RegisterWindowClass(Application* application) // 為本應用程序注冊一個類
{
WNDCLASSEX windowClass; // 窗口類
ZeroMemory (&windowClass, sizeof(WNDCLASSEX)); // 清空內存
windowClass.cbSize = sizeof(WNDCLASSEX); // 窗口類的大小
windowClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // 在窗口移動,改變大小的時候重繪
windowClass.lpfnWndProc = (WNDPROC)(WindowProc); // 用WindowProc函數處理消息
windowClass.hInstance = application->hInstance; // 設置實例
windowClass.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE); // 類背景的畫刷顏色
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); // 載入滑鼠指針
windowClass.lpszClassName = application->className; // 設置應用程序的類名
if (RegisterClassEx(&windowClass) == 0) // 注冊類失敗?
{
MessageBox(HWND_DESKTOP, "應用程序類注冊失敗!\nRegisterClassEx Failed!", "Error", MB_OK | MB_ICONEXCLAMATION);
return FALSE; // 返回False (注冊失敗)
}
return TRUE; // 返回True (注冊成功)
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
Application application; // 應用程序
GL_Window window; // 窗口
Keys keys; // 鍵盤按鍵
MSG msg; // Window消息
BOOL bRet; // 保存消息獲得是否成功

// 給應用程序賦值
application.className = CLASSNAME; // 程序類名字
application.hInstance = hInstance; // 程序入口

// 窗口相關信息設置
ZeroMemory(&window, sizeof(GL_Window)); // 清零窗口變數的內存空間
window.keys = &keys; // 設置按鍵
window.init.application = &application; // 設置窗口程序
window.init.title = TITLE; // 設置標題
window.init.width = WIDTH; // 設置窗口寬度
window.init.height = HEIGHT; // 設置窗口高度
window.init.bitsPerPixel = BPP; // 設置每像素的位數
window.init.isFullScreen = FALSE; // 設置初始窗口是否全屏否(FALSE)
ZeroMemory(&keys, sizeof(Keys)); // 鍵盤緩沖清零

if (RegisterWindowClass(&application) == FALSE) // 注冊類是否失敗
{
MessageBox(HWND_DESKTOP, "窗口類注冊失敗!\nError Registering Window Class!", "Error", MB_OK | MB_ICONEXCLAMATION);
return -1; // 結束程序
}

if (CreateWindowGL(&window) == TRUE) // 創建窗口是否成功
{
if (Initialize(&window, &keys) == FALSE) // 初始化OpenGL繪製程序
{
PostMessage(window.hWnd, WM_QUIT, 0, 0); // 拋出消息WM_QUIT
}
}
else
{
return 0; // 退出程序
}

while ((bRet = GetMessage(&msg, NULL, 0, 0) != 0)) // 循環直到收到消息為WM_QUIT
{
if (bRet != -1)
{
Update(); // 更新處理消息事件
TranslateMessage(&msg); // 傳遞消息
DispatchMessage(&msg); // 分派消息
}
else
{
break; // 退出循環
}
}
// 退出消息循環,准備退出程序
Deinitialize(); // 做退出前的掃尾工作
DestroyWindowGL(&window); // 銷毀窗口
UnregisterClass(application.className, application.hInstance); // 注銷窗口類
return 0; // 退出程序
}

BOOL Initialize(GL_Window* window, Keys* keys) // 用戶繪制場景相關的函數在此處定義
{
// 設置全局變數
OGL_window = window;
OGL_keys = keys;

// 建立時鍾
SetTimer(window->hWnd, TIMER1, 33, NULL);

// 在此處初始化繪制場景
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // 清屏為黑色
glClearDepth(1.0f); // 設置深度緩存
glDepthFunc(GL_LEQUAL); // 選擇深度測試方式
glEnable(GL_DEPTH_TEST); // 開啟深度測試
glShadeModel(GL_SMOOTH); // 陰暗處理採用平滑方式
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 最精細的透視計算

return TRUE; // 初始化成功返回TRUE
}

void DrawSceneGL(void) // 繪制場景
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除顏色和深度緩存
glLoadIdentity(); // 重置當前矩陣
//在此處添加代碼進行繪制:
glShadeModel(GL_SMOOTH); // 陰暗處理採用平滑方式(Smooth Shading)

glTranslatef(-1.5f, 1.0f, -6.0f); // 坐標原點往左移1.5f,往上移1.0f,往內移6.0f
glBegin(GL_TRIANGLES); // 開始繪制一個三角形
glColor3ub(255, 0, 0); // 定義上頂點為紅色
glVertex3f(0.0f, 1.0f, 0.0f); // 繪制上頂點
glColor3ub(0, 255, 0); // 定義左下頂點為綠色
glVertex3f( -1.0f, -1.0f, 0.0f); // 繪制左下頂點
glColor3ub(255, 255, 0); // 定義右下頂點為黃色
glVertex3f(1.0f, -1.0f, 0.0f); // 繪制右下頂點
glEnd();

glTranslatef(3.0f, 0.0f, 0.0f); // 向右平移3.0f
glColor3ub(0, 255, 255); // 定義正方形的顏色
glBegin(GL_QUADS); // 開始繪制一個正方形
glVertex3f(-1.0f, 1.0f, 0.0f); // 繪制左上角頂點
glVertex3f(-1.0f,-1.0f, 0.0f); // 繪制左下角頂點
glVertex3f( 1.0f,-1.0f, 0.0f); // 繪制右下角頂點
glVertex3f( 1.0f, 1.0f, 0.0f); // 繪制右上角頂點
glEnd();

glTranslatef(-1.5f, -2.0f, 0.0f); // 向左移1.5f,向下移2.0f
glColor3f(0.0f, 0.8f, 0.2f); // 綠色
glBegin(GL_LINE_LOOP); // 繪制圓
for (int i=0; i<NUM; i++)
{
glVertex3f(1.5f*(float)sin(2.0f*3.14f*i/NUM), 0.0f, 1.5f*(float)cos(2.0f*3.14f*i/NUM));
}
glEnd();

glFlush(); // 刷新GL命令隊列
}

void Update(void) // 在此處更新對消息的動作
{
if (OGL_keys->keyDown[VK_ESCAPE] == TRUE) // 判斷ESC鍵是否按下
{
PostMessage(OGL_window->hWnd, WM_QUIT, 0, 0); // 結束程序
}

if (OGL_keys->keyDown[VK_F1] == TRUE) // 判斷F1是否按下
{
PostMessage(OGL_window->hWnd, WM_TOGGLEFULLSCREEN, 0, 0); // 在全屏/窗口模式間切換
}
}

void Deinitialize(void) // 在此處做退出前掃尾工作
{
KillTimer(OGL_window->hWnd, TIMER1); // 釋放時鍾
}

㈡ 怎麼用c語言打開一個MP3文件(直接給代碼),需要什麼軟體進行輸入

VC++中播放聲音的方法
2009-09-23 14:58
聲音是多媒體的一個重要組成部分,在應用程序中加入聲音可以使界面更友好。在VC++中可以根據不同的應用要求,用不同的方法實現聲音的播放雹手。

一.播放聲音文件的簡單方法
在VC++ 中的多媒體動態連接庫中提供了一組與音頻設備有關的函數。利用這些函數可以方便地播放聲音。最簡單的播放聲音方法就是直接調用VC++中提供的聲音播放函數BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound ); 或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound );其中參數lpszSound是需要播放聲音的.WAV文件的路徑和文件名, hmod在這里為NULL,fuSound是播放聲音的標滾肆世志,詳細說明請參考VC++中的幫助。 例如播放C:soundmusic.wav可以用sndPlaySound ("c:\sound\music.wav",SND_ASYNC);或PlaySound("c:\sound\music.wav",NULL, SND_ASYNC|SND_NODEFAULT );如果沒有找到music.wav文件,第一種格式將播放系統默認的聲音,第二種格式不會播放系統默認的聲音。

二.將聲音文件加入到程序中
在VC++的程序設計中,可以利用各種標準的資源,如點陣圖,菜單,對話框等。同時VC++也允許用戶自定義資源,因此我們可以將聲音文件作為用戶自定義資源加入程序資源文件中,經過編譯連接生成EXE文件,實現無.WAV文件的聲音播放。
要實現作為資源的聲音文件的播放,首先要在資源管理器中加入待播放的聲音文件(實現過程並不復雜,大肢這里不在敘述)。假設生成的聲音文件資源標識符為IDR_WAVE1。在播放時只需要調用下面的語句:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(), SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);
其中MAKEINTRESOURCE()宏將整數資源標識符轉變為字元串,AfxGetResourceHandle()函數返回包含資源的模塊句柄,
SND_RESOURCE是必須的標志。
作為資源的聲音文件的第二種播放方法是把資源讀入內存後作為內存數據播放。具體步驟入下:
1.獲得包含資源的模塊句柄:
HMODULE hmod=AfxGetResourceHandle();
2.檢索資源塊信息:
HRSRC hSndResource=FindResource(hmod,MAKEINTRESOURCE(IDR_WAVE1),_T("WAVE"));
3. 裝載資源數據並加鎖:
HGLOBAL hGlobalMem=LoadResource(hmod,hSndResource);
LPCTSTR lpMemSound=(LPCSTR)LockResource(hGlobalMem);
4.播放聲音文件:
sndPlaySound(lpMemSound,SND_MEMORY));
5.釋放資源句柄:
FreeResource(hGlobalMem);

三.播放聲音文件的高級方法
在VC++中提供了一組對音頻設備及多媒體文件直接進行操作的函數。利用這些函數可以靈活地對聲音文件進行各種處理。
首先介紹幾個要用到的數據結構。WAVEFORMATEX結構定義了WAVE音頻數據文件的格式。WAVEHDR結構定義了波形音頻緩沖區。讀出的數據首先要填充此緩沖區才能送音頻設備播放。WAVEOUTCAPS結構描述了音頻設備的性能。MMCKINFO結構包含了RIFF文件中一個塊的信息。詳細的說明請參考VC++中的幫助。
下面給出程序流程簡圖及程序源代碼清單,在VC++環境下可直接使用:

源程序清單如下:
LPSTR szFileName;//聲音文件名
MMCKINFO mmckinfoParent;
MMCKINFO mmckinfoSubChunk;
DWORD dwFmtSize;
HMMIO m_hmmio;//音頻文件句柄
DWORD m_WaveLong;
HPSTR lpData;//音頻數據
HANDLE m_hData;
HANDLE m_hFormat;
WAVEFORMATEX * lpFormat;
DWORD m_dwDataOffset;
DWORD m_dwDataSize;
WAVEHDR pWaveOutHdr;
WAVEOUTCAPS pwoc;
HWAVEOUT hWaveOut;
//打開波形文件
if(!(m_hmmio=mmioOpen(szFileName,NULL,MMIO_READ|MMIO_ALLOCBUF)))
{
//File open Error
Error("Failed to open the file.");//錯誤處理函數
return false;
}
//檢查打開文件是否是聲音文件
mmckinfoParent.fccType =mmioFOURCC('W','A','V','E');
if(mmioDescend(m_hmmio,(LPMMCKINFO)&mmckinfoParent,NULL,MMIO_FINDRIFF))
{
//NOT WAVE FILE AND QUIT
}
//尋找 'fmt' 塊
mmckinfoSubChunk.ckid =mmioFOURCC('f','m','t',' ');
if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK))
{
//Can't find 'fmt' chunk
}
//獲得 'fmt '塊的大小,申請內存
dwFmtSize=mmckinfoSubChunk.cksize ;
m_hFormat=LocalAlloc(LMEM_MOVEABLE,LOWORD(dwFmtSize));
if(!m_hFormat)
{
//failed alloc memory
}
lpFormat=(WAVEFORMATEX*)LocalLock(m_hFormat);
if(!lpFormat)
{
//failed to lock the memory
}
if((unsigned long)mmioRead(m_hmmio,(HPSTR)lpFormat,dwFmtSize)!=dwFmtSize)
{
//failed to read format chunk
}
//離開 fmt 塊
mmioAscend(m_hmmio,&mmckinfoSubChunk,0);
//尋找 'data' 塊
mmckinfoSubChunk.ckid=mmioFOURCC('d','a','t','a');
if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK))
{
//Can't find 'data' chunk
}
//獲得 'data'塊的大小
m_dwDataSize=mmckinfoSubChunk.cksize ;
m_dwDataOffset =mmckinfoSubChunk.dwDataOffset ;
if(m_dwDataSize==0L)
{
//no data in the 'data' chunk
}
//為音頻數據分配內存
lpData=new char[m_dwDataSize];
if(!lpData)
{
//faile
}
if(mmioSeek(m_hmmio,SoundOffset,SEEK_SET)<0)
{
//Failed to read the data chunk
}
m_WaveLong=mmioRead(m_hmmio,lpData,SoundLong);
if(m_WaveLong<0)
{
//Failed to read the data chunk
}
//檢查音頻設備,返迴音頻輸出設備的性能
if(waveOutGetDeVCaps(WAVE_MAPPER,&pwoc,sizeof(WAVEOUTCAPS))!=0)
{
//Unable to allocate or lock memory
}
//檢查音頻輸出設備是否能播放指定的音頻文件
if(waveOutOpen(&hWaveOut,DevsNum,lpFormat,NULL,NULL,CALLBACK_NULL)!=0)
{
//Failed to OPEN the wave out devices
}
//准備待播放的數據
pWaveOutHdr.lpData =(HPSTR)lpData;
pWave

OutHdr.dwBufferLength =m_WaveLong;
pWaveOutHdr.dwFlags =0;
if(waveOutPrepareHeader(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0)
{
//Failed to prepare the wave data buffer
}
//播放音頻數據文件
if(waveOutWrite(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0)
{
//Failed to write the wave data buffer
}
//關閉音頻輸出設備,釋放內存
waveOutReset(hWaveOut);
waveOutClose(hWaveOut);
LocalUnlock(m_hFormat);
LocalFree(m_hFormat);
delete [] lpData;
說明:1)以上使用的音頻設備和聲音文件操作函數的聲明包含在mmsystem.h頭文件中,因此在程序中必須用#include "mmsystem.h"語句加入頭文件。同時在編譯時要加入動態連接導入庫winmm.lib,具體實現方法是從Developer Studio的Project菜單中選擇Settings,然後在Link選項卡上的Object/Library Moles控制中加入winmm.lib。2)在pWaveOutHdr.lpData中指定不同的數據,可以播放音頻數據文件中任意指定位置的聲音。3) 以上程序均在VC++6.0中調試通過,在文中省略了對錯誤及異常情況的處理,在實際應用中必須加入。
四.結論
在VC++中可以根據應用需要採用不同的方法播放聲音文件。簡單應用可以直接調用聲音播放函數。第二種方法可以把聲音作為資源加入可執行文件中。如果在播放之前要對聲音數據進行處理,可用第三種方法。

參考書目:
1. 美 Paul Perry 陳向群 等譯《多媒體開發指南》 清華大學出版社
2. 美 Peter Norton, Rob McGregor 孫鳳英 等譯《MFC開發Windows95/NT4應用程序》 清華大學出版社 1998
3. 周敬利 《多媒體音效卡技術及應用》 電子工業出版社 1998

㈢ 【c++】怎樣才能使程序播放文件中的聲音

一.播放聲音文件的簡單方法
在VC++ 中的多媒體動態連接庫中提供了一組與音頻設備有關的函數。利用這些函數可以方便地播放聲音。最簡單的播放聲音方法就是直接調用VC++中提供的聲音播放函數BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound ); 或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound );其中參數lpszSound是需要播放聲音的.WAV文件的路徑和文件名, hmod在這里為NULL,fuSound是播放聲音的標志,詳細說明請參考VC++中的幫助。 例如播放C:soundmusic.wav可以用sndPlaySound ("c:\sound\music.wav",SND_ASYNC);或PlaySound("c:\sound\music.wav",NULL, SND_ASYNC|SND_NODEFAULT );如果沒有找到music.wav文件,第一種格式將播放系統默認的聲音,第二種格式不會播放系統默認的聲音。

二.將聲音文件加入到程序中
在VC++的程序設計中,可以利用各種標準的資源,如點陣圖,菜單,對話框等。同時VC++也允許用戶自定義資源,因此我們可以將聲音文件作為用戶自定義資源加入程序資源文件中,經過編譯連接生成EXE文件,實現無.WAV文件的聲音播放。
要實現作為資源的聲音文件的播放,首先要在資源管理器中加入待播放的聲音文件(實現過程並不復雜,這里不在敘述)。假設生成的聲音文件資源標識符為IDR_WAVE1。在播放時只需要調用下面的語句:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(), SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);
其中MAKEINTRESOURCE()宏將整數資源標識符轉變為字元串,AfxGetResourceHandle()函數返回包含資源的模塊句柄,
SND_RESOURCE是必須的標志。
作為資源的聲音文件的第二種播放方法是把資源讀入內存後作為內存數據播放。具體步驟入下:
1.獲得包含資源的模塊句柄:
HMODULE hmod=AfxGetResourceHandle();
2.檢索資源塊信息:
HRSRC hSndResource=FindResource(hmod,MAKEINTRESOURCE(IDR_WAVE1),_T("WAVE"));
3. 裝載資源數據並加鎖:
HGLOBAL hGlobalMem=LoadResource(hmod,hSndResource);
LPCTSTR lpMemSound=(LPCSTR)LockResource(hGlobalMem);
4.播放聲音文件:
sndPlaySound(lpMemSound,SND_MEMORY));
5.釋放資源句柄:
FreeResource(hGlobalMem);

三.播放聲音文件的高級方法
在VC++中提供了一組對音頻設備及多媒體文件直接進行操作的函數。利用這些函數可以靈活地對聲音文件進行各種處理。
首先介紹幾個要用到的數據結構。WAVEFORMATEX結構定義了WAVE音頻數據文件的格式。WAVEHDR結構定義了波形音頻緩沖區。讀出的數據首先要填充此緩沖區才能送音頻設備播放。WAVEOUTCAPS結構描述了音頻設備的性能。MMCKINFO結構包含了RIFF文件中一個塊的信息。詳細的說明請參考VC++中的幫助。
下面給出程序流程簡圖及程序源代碼清單,在VC++環境下可直接使用:

源程序清單如下:
LPSTR szFileName;//聲音文件名
MMCKINFO mmckinfoParent;
MMCKINFO mmckinfoSubChunk;
DWORD dwFmtSize;
HMMIO m_hmmio;//音頻文件句柄
DWORD m_WaveLong;
HPSTR lpData;//音頻數據
HANDLE m_hData;
HANDLE m_hFormat;
WAVEFORMATEX * lpFormat;
DWORD m_dwDataOffset;
DWORD m_dwDataSize;
WAVEHDR pWaveOutHdr;
WAVEOUTCAPS pwoc;
HWAVEOUT hWaveOut;
//打開波形文件
if(!(m_hmmio=mmioOpen(szFileName,NULL,MMIO_READ|MMIO_ALLOCBUF)))
{
//File open Error
Error("Failed to open the file.");//錯誤處理函數
return false;
}
//檢查打開文件是否是聲音文件
mmckinfoParent.fccType =mmioFOURCC(』W』,』A』,』V』,』E』);
if(mmioDescend(m_hmmio,(LPMMCKINFO)&mmckinfoParent,NULL,MMIO_FINDRIFF))
{
//NOT WAVE FILE AND QUIT
}
//尋找 』fmt』 塊
mmckinfoSubChunk.ckid =mmioFOURCC(』f』,』m』,』t』,』 』);
if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK))
{
//Can』t find 』fmt』 chunk
}
//獲得 』fmt 』塊的大小,申請內存
dwFmtSize=mmckinfoSubChunk.cksize ;
m_hFormat=LocalAlloc(LMEM_MOVEABLE,LOWORD(dwFmtSize));
if(!m_hFormat)
{
//failed alloc memory
}
lpFormat=(WAVEFORMATEX*)LocalLock(m_hFormat);
if(!lpFormat)
{
//failed to lock the memory
}
if((unsigned long)mmioRead(m_hmmio,(HPSTR)lpFormat,dwFmtSize)!=dwFmtSize)
{
//failed to read format chunk
}
//離開 fmt 塊
mmioAscend(m_hmmio,&mmckinfoSubChunk,0);
//尋找 』data』 塊
mmckinfoSubChunk.ckid=mmioFOURCC(』d』,』a』,』t』,』a』);
if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK))
{
//Can』t find 』data』 chunk
}
//獲得 』data』塊的大小
m_dwDataSize=mmckinfoSubChunk.cksize ;
m_dwDataOffset =mmckinfoSubChunk.dwDataOffset ;
if(m_dwDataSize==0L)
{
//no data in the 』data』 chunk
}
//為音頻數據分配內存
lpData=new char[m_dwDataSize];
if(!lpData)
{
//faile
}
if(mmioSeek(m_hmmio,SoundOffset,SEEK_SET)<0)
{
//Failed to read the data chunk
}
m_WaveLong=mmioRead(m_hmmio,lpData,SoundLong);
if(m_WaveLong<0)
{
//Failed to read the data chunk
}
//檢查音頻設備,返迴音頻輸出設備的性能
if(waveOutGetDeVCaps(WAVE_MAPPER,&pwoc,sizeof(WAVEOUTCAPS))!=0)
{
//Unable to allocate or lock memory
}
//檢查音頻輸出設備是否能播放指定的音頻文件
if(waveOutOpen(&hWaveOut,DevsNum,lpFormat,NULL,NULL,CALLBACK_NULL)!=0)
{
//Failed to OPEN the wave out devices
}
//准備待播放的數據
pWaveOutHdr.lpData =(HPSTR)lpData;
pWaveOutHdr.dwBufferLength =m_WaveLong;
pWaveOutHdr.dwFlags =0;
if(waveOutPrepareHeader(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0)
{
//Failed to prepare the wave data buffer
}
//播放音頻數據文件
if(waveOutWrite(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0)
{
//Failed to write the wave data buffer
}
//關閉音頻輸出設備,釋放內存
waveOutReset(hWaveOut);
waveOutClose(hWaveOut);
LocalUnlock(m_hFormat);
LocalFree(m_hFormat);
delete [] lpData;
說明:1)以上使用的音頻設備和聲音文件操作函數的聲明包含在mmsystem.h頭文件中,因此在程序中必須用#include "mmsystem.h"語句加入頭文件。同時在編譯時要加入動態連接導入庫winmm.lib,具體實現方法是從Developer Studio的Project菜單中選擇Settings,然後在Link選項卡上的Object/Library Moles控制中加入winmm.lib。2)在pWaveOutHdr.lpData中指定不同的數據,可以播放音頻數據文件中任意指定位置的聲音。3) 以上程序均在VC++6.0中調試通過,在文中省略了對錯誤及異常情況的處理,在實際應用中必須加入。
四.結論
在VC++中可以根據應用需要採用不同的方法播放聲音文件。簡單應用可以直接調用聲音播放函數。第二種方法可以把聲音作為資源加入可執行文件中。如果在播放之前要對聲音數據進行處理,可用第三種方法。

㈣ 關於LOWORD和HIWORD的問題

#define LOWORD(l) ((WORD)((DWORD_PTR)(l) & 0xffff))
#define HIWORD(l) ((WORD)((DWORD_PTR)(l) >> 16))
這是windef.h頭文件中對宏LOWORD和HIWORD的定義。
作用分別是取出無符號長整型參數的高16位和低16位。
因為一個長整型佔32位,其中高低16位的值可能有不同的意義,需要通過這2個宏分別取出來使用。取出來的結果是一個無符號短整型的激啟值。
其原理正如定義那樣,取低16位洞衡的宏LOWORD使用按位與操作符與數字0xffff運算,而數字0xffff是一個低16位全為1的數納鉛做字,那麼對其位與操作可以得到參數的低16位。
而取高16位的宏HIWORD則更簡單,只需將參數右移16位,剩下的就是原高16位的值了。

㈤ 如何做個軟體控制滑鼠循環單擊屏幕上某幾個固定的點(坐標)

:59:00 | By: 藍色多瑙河 ]

1)運行模擬滑鼠功能的一些程序,此法適用於諸多的操作系統(已經測試過了95,97,98,98se,2000,me等,還沒有測試過DOS,win3.x和NT)。這種程序的運用可以在很大程度上上代替滑鼠(除了那些需要在按住滑鼠左鍵的同時還要移動滑鼠的操作,如:對窗口的隨意拖動,word文檔中內容的連續選擇和文件夾間的拖動等)。運用這類模擬程序,我們可以設置滑鼠移動的(八個)方向鍵,邏輯左鍵,邏輯右鍵,左雙擊鍵,右雙擊鍵,以及滑鼠滑動的速度等,這些一般設置在數字小鍵盤上(當然設置在大鍵盤上也未必不可,視個人的習慣而定。這些程序在國外非常的多,但是國內使用較多的是Virtual Mouse。

2)直接利用數字小鍵盤來模擬滑鼠的多數功能,但是這項功能只在win98以上的版本中開放了,低於win98的系統(如97,95)就沒有此功能。我們可以在"開始-->設置-->控制面板-->輔助選項-->滑鼠-->滑鼠鍵"中找到這項功能。為了讓讀者免除閱讀幫助文件的麻煩和痛苦(因為它說明的不清不楚,讓人費解),下面我把它的具體使用方法給大家說明一下,希望能夠講述得比Bill Gates的"瘟酒吧-吐"清楚那麼一點點。

和第一種方法--滑鼠功能模擬程序那樣,1,2,3,6,9,8,7,4八個數字鍵是滑鼠的(八個)方向鍵的替代鍵,5代替滑鼠的單擊(既可以是左鍵的單擊,也可以是右鍵的單擊,具體是哪個鍵要看在tray中的滑鼠鍵狀態圖標的指示)指伏,撳下5在滑鼠鍵狀態圖標上的反應是相應的鍵的一次閃爍;"+"代替雙擊(同樣也沒有指定是哪個鍵的雙擊),在滑鼠鍵圖標上的反應是相應的鍵連續閃爍兩次;"*"代替左右兩鍵的同時單擊,在滑鼠鍵圖標上的反應是相應的兩個鍵同時閃爍一次,"/"是切換鍵,既是單擊與雙擊間的切換,又是左鍵和右鍵間的切換;所有的這些狀態都會在狀態欄中的滑鼠鍵圖標上得到體現,當然左右鍵的狀態是非常明顯的顯示在相應的圖標上,而單擊顯示為灰色,雙擊顯示為黑色。"0(Ins)"鍵代替按下滑鼠鍵(同樣沒有指明左右鍵),在滑鼠鍵狀態圖標上的反應是相應的鍵由灰變黑,這個鍵為我們拖動文件夾,選擇文檔的部分內容提供了方便;"·(del)"鍵則代替釋放滑鼠鍵,在滑鼠鍵圖標上的反應是相應的鍵由黑變灰。還可以設置滑鼠移動的速度(crl表示加速,shift表示減速),數字小鍵盤的開關鍵(Alt+Shift+NumLock)等等。

記住,由於數字小鍵盤不是真的滑鼠,所以要領會它的一些規章制度。要領就是先確定下面的操作是左鍵呢還是右鍵,以及是單擊呢還是雙擊,滑鼠鍵是按下還是松開?然後再進行相關的操作。

如果您還沒有聽清的話,或者您想知道得更多一些,請參考相關的幫助文件。

3)用鍵盤的各種快捷鍵/組合鍵來代替滑鼠的各種操作,當然這種方法的缺點就是要記憶許多的組合鍵,如同dos命令相對於windows操作來說的那種麻煩和擾人:

[左鍵]大小鍵盤上的enter鍵。

[右鍵]用shift+F10可以完全代替,而alt+enter則是shift+F10+R的替族謹代鍵:查看某選項(可以是文件,也可以是文件夾,甚至是硬碟)的屬性。兆逗基

[菜單的彈出與激活]可以用alt鍵或者組合鍵ctrl+f10來彈出第一個菜單,或者用alt+相應的字母,直接彈出對應的菜單;在子菜單中,可以直接用相應的縮寫字母來執行對應的功能,也可以用鍵盤中的上下鍵移到相應的子菜單項上(特別是對於那些子菜單非常多,而我們需要的東東又在倒數幾個的位置),再用enter鍵執行該功能。

[win鍵]^+ESC

[選定、選擇]SHIFT+方向鍵為行選擇方式,SHIFT+ALT+方向鍵為列選擇方式(列選擇在word排版時比較適用)

shift+home/end:選定的范圍是從當前的游標位置到行首/行末;

shift+PageUp/PageDown:選定的范圍從當前的游標處到頁首/頁末;

shift+ctrl+PageUp/PageDown:選定的范圍從當前的游標處到文頂/文底(注意ctrl+PageUp/PageDown的效果是將游標直接跳到頂部/底部,配合滑鼠的操作特別奏效)

[TAB鍵]IE中:在 Web 頁、地址欄和鏈接欄中向前移動到下一個項目;

alt+home:進入您的主頁

[當前窗口間的切換]

如果只有少數幾個窗口的話,就直接利用alt+TAB鍵來切換,

ALT+TAB:兩個鍵同時按下時,是在切換,但是當前的活動窗口還沒有改變,直到alt鍵松開時,活動窗口才改變,shift+alt+tab切換順序變成為逆序,

ALT+ESC:每按下一次該組合鍵(不管alt鍵松開與否),當前的活動窗口就順序的變成下一個,shift+alt+esc:功能和alt+esc一樣,只不過是切換順序變成了逆序

如果開有非常多的程序窗口,先用^+ESC彈出win鍵,然後用ESC取消,接著再利用TAB鍵在win鍵,狀態欄,工具欄和sys tray之間切換,當滑鼠切換到相應的地方時,再運用左右鍵;

最後的辦法就是用alt+space彈出窗口的控制菜單,然後將當前窗口最小化,最後就可以看到需要的窗口了。

[窗口的最大化,最小化,關閉]

窗口的關閉:ALT+F4,CTRL+W,ALT+F+X,CAD(^+ALT+DEL)再選擇需要關閉的窗口名稱,或者用alt+space彈出控制菜單,然後選擇"關閉"一項;

其中alt+f4是退出某程序,ctrl+w是關閉某程序的當前窗口,而不關閉其他窗口,但是如果某程序只開了一個窗口時,其效果就是退出該程序;

最大、最小化、以及恢復/還原:ALT+SPACE(打開窗口的控制菜單,選擇恢復/還原、最大化,最小化,調節窗口大小、移動等功能項)

[窗口的移動]ALT+SPACE打開控制菜單,然後選擇m(移動)一項,這樣用上下左右鍵就可以移動窗口了,

[窗口大小的改變]ALT+SPACE,然後選擇s(大小)一項,同樣的,上下左右鍵可以改變窗口的大小

[窗口的翻頁]:PageDown和PageUp分別是向下和向上翻一頁,ctrl+PageDown和ctrl+PageUp分別是翻到窗口的底部和頂端,

home/end:到行首和行尾,在IE中是到窗口的top和bottum

[文件的移動、改名與刪除]DEL:放到回收站中,SHIFT+DEL:直接刪除,不經過回收站

[文件的選擇]選擇一個:就是用上下左右鍵來選擇;

選擇全部:用ctrl+a鍵就可以了;

有規律性的或者說是連續性的選擇:用shift+方向鍵就可以了;

無規律性的選擇:按住ctrl鍵,然後按方向鍵到所需要選擇的項目上,然後按下空格space鍵就可選上該項目,然後再移動方向鍵,再space進行選擇(此時需要一直按著ctrl鍵);

如果在眾多的項目中只有少數的項目不選:我們可以先選擇好這些不需要選擇的項目,然後用編輯菜單下的"反向選擇"功能進行選擇,就達到了選擇大多數項目的目的;

[工具欄中功能的實現]前進、後退、向上、停止、cut,,paste、undo,delete,屬性

請參考windows幫助系統中的"快睫方式,鍵盤"一項的具體說明

CTRL+S,ALT+F+S,ALT+F+A,

ctrl+Z,ALT+BackSpace:取消上一步的操作,也就是會到上一步的操作結果中,但是不能夠回到下一步的操作結果中。

BackSpace是後退一步,在IE中類似於alt+〈-

[某些屬性的快捷鍵(有滑鼠時也是如此)]

CAD(ctrl+ALT+DEL):終止進程、關閉和重啟計算機

ctrl+A:對當前編輯窗口中的內容進行全選;

ctrl+C:對已經被選定的對象進行復制;

ctrl+V:在游標位置粘貼已經被復制的對象/內容,同時被復制的對象不被刪除;

ctrl+X:對被選定的內容/對象進行復制,並且在該內容/對象已經被粘貼之後,再刪除原有的內容/對象,否則不予刪除;(有點類似於^+C)

ctrl+Z:對最近的一次操作進行反悔(undo)、撤消;

ALT+BackSpace:undo

ctrl+S:保存當前窗口的內容,以及快速保存,和Alt+F+s效果相同

ctrl+N:在現有IE窗口的基礎上再打開一個新窗口,新窗口的內容與當前窗口一樣;

ctrl+P:彈出列印有關的內容的菜單,知道確認後才正式的列印。

ctrl+B:在office編輯中,起到對字體加黑/去黑的作用;

ctrl+I:在office編輯中,起到對字體傾斜/去斜的作用;

ctrl+W:效果和組合鍵Alt+F4相同,關閉當前的窗口(而不是直接關閉當前窗口涉及的程序),在IE,Office程序,我的電腦以及windows資源管理器中起到亦起相同作用

ctrl+R:類似於ctrl+F5,對當前內容進行強制性的更新,而不檢驗、對比內容的日期

ALT+ENTER:快速查看所選項目的屬性,功能和SHIFT+F10+R/P一樣

ALT+PrintScreen:將整個屏幕上的內容存成圖片並在剪貼板中,以供復制

SHIFT+F10:彈出"打開方式"

·在win系列的啟動中按住SHIFT,可以直接進入"安全模式",出現win畫面後再按SHIFT鍵,則跳過 "開始/程序/啟動"程序組中的程序

·在放入光碟時按住SHIFT,則是作為自動播放的開關/轉化、

·在^+ALT+SHIFT之後需要重新啟動機器時,按住SHIFT,則是重新啟動GUI即windows,而不需要再從BIOS開始,某些時候節約了時間,加快了速度。

shift+dele:徹底地刪除文件,而不是扔到垃圾箱中

[功能鍵]

F1:幫助文件的導出,

f2:重新命名的快捷方式,功能等同於"右鍵-->重命名"

F3:對內容的查找,作用等同於"win鍵-->查找-->文件或文件夾"

f4:將游標指向地址欄,並且彈出當前地址的相對地址,以及所有的地址(在資源管理器中)

shift+f4:將游標指向地址欄,並且彈出當前地址的相對地址,以及所有的地址(在資源管理器中)

ctrl

+f4:將游標指向地址欄,而沒有其他的操作

F5:對內容的更新/刷新,在文本編輯框中,調出當前的時間:時分年月日,比如19:18 2000-08-02

F5 或

CTRL+R 僅當 Web 上的頁面與本機存儲的 Web 頁時間戳不同時,才刷新當前 Web 頁

CTRL+F5 即使 Web 上的頁面與本機存儲的 Web 頁時間戳相同,仍然刷新當前 Web 頁

f6:功能和tab鍵一樣,完成順序的切換,ctrl+f6也一樣

shift+f6:功能和shift+tab鍵一樣,完成逆序的切換工作

f10:相當與alt鍵的功能類似,彈出的菜單中包含是第一個菜單(多數為文件)的內容,同時還有在所選擇的項目上的右鍵所彈出的菜單的內容

shift+f10:滑鼠的右鍵功能,在IE中是顯示某個鏈接的快捷菜單

F11:在全屏幕和常規窗口(最大化)之間進行切換;

[在IE中的操作]

ESC:終止網頁下載(更新)過程,而不取消所下載的網頁,也就是說,下載了多少網頁代碼,就解釋/顯示多少網頁內容

CTRL+L:轉到新位置

ctrl+o:在IE中是彈出"打開新網頁"的對話框

CTRL+N:直接打開新窗口(內容和最後一次成功顯示的頁面內容相同)

CTRL+W:關閉當前窗口

CTRL+S:保存當前頁

CTRL+P:列印當前頁或當前框架

ENTER:激活選定的鏈接

CTRL+E:在瀏覽欄中打開搜索頁

CTRL+I:在瀏覽欄中打開收藏夾

CTRL+H:在瀏覽欄中打開歷史記錄

CTRL+單擊:在歷史記錄或收藏欄上,打開多個文件夾

alt+右箭頭鍵

alt+左箭頭鍵

[使用地址欄]

ALT+D:選擇地址欄中的文字

F4:顯示地址欄的歷史記錄

CTRL+向左箭頭:在地址欄中時,將游標左移到相鄰的邏輯分隔符(. 或 /)

CTRL+向右箭頭:在地址欄中時,將游標右移到相鄰的邏輯分隔符(. 或 /)

CTRL+ENTER:在地址欄中將""添加到鍵入的文本的前面,將".com"添加到文本的後面

向上箭頭:在"自動完成"建議項的列表中向前移動

向下箭頭:在"自動完成"建議項的列表中向後移動

[使用收藏夾]

CTRL+D:將當前 Web 頁添加到收藏夾中

CTRL+B:打開"整理收藏夾"對話框

ALT+UPARROW:在"整理收藏夾"對話框的"收藏夾"列表中向上移動所選項目

ALT+DOWNARROW:在"整理收藏夾"對話框的"收藏夾"列表中向下移動所選項目

[文本的編輯]

CTRL+X:刪除所選項目並將其復制到剪貼板中

CTRL+C:將所選項目復制到剪貼板

CTRL+V:將剪貼板中的內容插入到所選位置

CTRL+A:選中當前 Web 頁中的所有項目

在word(office)編排時,ctrl+"="為下標;ctrl+shift為上標;ctrl+b為黑體;ctrl+i為斜體;ctrl+u為下劃線;

滑鼠的拖動:將所選項目的快捷方式拖到新的地方(如桌面,另外的文件夾中)

ctrl+拖動:可在任意兩文件夾之間拷貝(不同盤之間可剩去ctrl);

shift+拖動:可在任意兩個文件夾之間移動(同一盤上可剩去shift;

ctrl+shift+拖動:創建快捷方式

ctrl+shift:切換中文輸入法

shift+空格:切換全形/半形方式

在IE中,用shift+左鍵確認:在新的窗口中顯示該鏈接指定的web頁面的內容

或者

函數功能:該函數定義一個系統范圍的熱鍵。

函數原型:BOOL RegisterHotKey(HWND hWnd,intid,UINT fsModifiers,UINT vk);

參數:

hWnd:接收熱鍵產生WM_HOTKEY消息的窗口句柄。若該參數NULL,傳遞給調用線程的WM_HOTKEY消息必須在消息循環中中進行處理。

id:定義熱鍵的標識符。調用線程中的其他熱鍵不能使用同樣的標識符。應用功能程序必須定義一個0X0000-0xBFFF范圍的值。一個共享的動態鏈接庫(DLL)必須定義一個0xC000-0xFFFF范圍的值伯GlobalAddAtom函數返回該范圍)。為了避免與其他動態鏈接庫定義的熱鍵沖突,一個DLL必須使用GlobalAddAtom函數獲得熱鍵的標識符。

fsModifoers:定義為了產生WM_HOTKEY消息而必須與由nVirtKey參數定義的鍵一起按下的鍵。該參數可以是如下值的組合:

MOD_ALT:按下的可以是任一Alt鍵。

MOD_CONTROL:按下的可以是任一Ctrl鍵。

MOD_SHIFT:按下的可以是任一Shift鍵。

MOD_WIN:按下的可以是任一Windows按鍵。這些鍵可以用Microsoft Windows日誌記錄下來。

vk:定義熱鍵的虛擬鍵碼。

返回值:若函數調用成功,返回一個非O值。若函數調用失敗,則返回值為0。若要獲得更多的錯誤信息,可以調用GetLastError函數。

備註:當某鍵被接下時,系統在所有的熱鍵中尋找匹配者。一旦找到一個匹配的熱鍵,系統將把WM_HOTKEY消息傳遞給登記了該熱鍵的線程的消息隊列。該消息被傳送到隊列頭部,因此它將在下一輪消息循環中被移去。該函數不能將熱鍵同其他線程創建的窗口關聯起來。

若為一熱鍵定義的擊鍵己被其他熱鍵所定義,則RegisterHotKey函數調用失敗。

若hWnd參數標識的窗口已用與id參數定義的相同的標識符登記了一個熱鍵,則參數fsModifiers和vk的新值將替代這些參數先前定義的值。

Windows CE:Windows CE 2.0以上版本對於參數fsModifiers支持一個附加的標志位。叫做MOD_KEYUP。

若設置MOD_KEYUP位,則當發生鍵被按下或被彈起的事件時,窗口將發送WM_HOTKEY消息。

RegisterHotKey可以被用來在線程之間登記熱鍵。

速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;頭文件:winuser.h;庫文件:user32.lib。

為了得到唯一標識,我們還將用到另一個API函數

ATOM GlobalAddAtom(

LPCTSTR lpString //自己設定的一個字元串

);

因為我們還要在程序退出的時候,消除這個熱鍵, 所以需要聲明一個全局變數:

HotKeyId: Integer;

第一步:

在窗口的create事件中,加入以下代碼

HotKeyId := GlobalAddAtom(『MyHotKey』) - $C000;
註: HotKeyId的合法取之范圍是0x0000到0xBFFF之間, GlobalAddAtom函數得到的值
在0xC000到0xFFFF之間,所以減掉0xC000來滿足調用要求。

第二步:

在上面的代碼下面加入:

RegisterHotKey(Handle, hotkeyid, MOD_ALT, VK_F8);

熱鍵的輔助按鍵包括Mod_Ctrl 、Mod_Alt、Mod_Shift,對於Windows兼容鍵盤還支持Windows
鍵,即其鍵面上有Windows標志的那個鍵,其值為Mod_win。

上面 的代碼注冊了一個熱鍵:ALT+F8。當然如果你希望象TAKEIT那樣,只用F8, 就這么寫:

RegisterHotKey(Handle, hotkeyid, 0, VK_F8);

註:handle是一個特殊的變數,它表示當前窗口的句柄。

這個函數你應該能句舉一反三了吧。

原理:

一旦熱鍵設置成功,在程序應用過程中如果有相應的鍵被按下,Windows系統都會給你的應
用程序發送一個消息WM_HOTKEY,不管你的應用程序是否為當前活動的。其中WM_HOTKEY消
息的格式為:

idHotKey = (int) wParam; // 該參數在設置系統級的熱鍵有用,一般不予使用
fuModifiers = (UINT) LOWORD(lParam); //熱鍵的輔助按鍵
uVirtKey = (UINT) HIWORD(lParam); //熱鍵的鍵值

第三步:

注冊了熱鍵,就該寫下響應代碼了。

首先,在程序頭部分的private段中加入聲明 (作用是聲明這個過程,和聲明變數類似。
關於如何聲明函數、過程,請請參考各自的幫助文件或其它資料):

procere HotKeyDown(var Msg: Tmessage); message WM_HOTKEY;

然後在程序中加入如下代碼:

procere Tfmain.HotKeyDown(var Msg: Tmessage);

begin

if (Msg.LparamLo = MOD_ALT) AND Msg.LParamHi = VK_F8 then // 假設熱鍵為ALT+F8

begin

end;

最後一步:

在窗口的close事件中加入

UnRegisterHotKey(handle, HotKeyId); //注銷HotKey, 釋放資源

測試代碼:

首先用RegisterHotKey函數注冊一個熱鍵,例如Enter鍵。當按下Enter後,就調用mouse_event函數,模擬點擊滑鼠左鍵。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procere FormCreate(Sender: TObject);
procere FormDestroy(Sender: TObject);
procere OnHotKey(var msg:Tmessage);message WM_HOTKEY;
private

public

end;

var
Form1: TForm1;

implementation

procere TForm1.OnHotKey(var msg:Tmessage);
var
pt:TPoint;
begin
if msg.WParam=9999 then
begin
GetCursorPos(pt);
mouse_event(MOUSEEVENTF_LEFTDOWN,pt.x,pt.y,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,pt.x,pt.y,0,0);
end;
end;

procere TForm1.FormCreate(Sender: TObject);
begin
RegisterHotkey(handle,9999,0,VK_RETURN); //注冊一個id為9999的hotkey
end;

procere TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotkey(handle,9999);
end;

end.

試試以上代碼,運行時按回車鍵,就會模擬點擊滑鼠左鍵的了。

㈥ Win32 Application 初學對話框的源代碼中 resource.h的頭文件怎麼找不到

你需要碼亂用insert resource 用vc的資源編輯器 創建對話遲寬檔框資源 vc自動給你生成巧空的頭文件 .......

㈦ 在WIN32編程里,為什麼一直提示LOWORD未定義,已經加入頭文件了

你是不是把LOWORD用括弧括起來了

㈧ C++中怎麼用API作圖啊 ,要包含什麼頭文件嗎 在先急等

#include "windows.h"
#include "winuser.h"
#include "wingdi.h"

HWND hwnd = 0; //如果是0,則表示在屏幕上畫
HDC hdc = GetDC(hwnd);
Ellipse(hdc,0,0,100,100); //畫圓
Rectangle(hdc,0,100,100,200);//畫矩形
ReleaseDC(hwnd,hdc);

㈨ 音頻設備測試無法播放聲音

一.播放聲音文件的簡單方法
在VC++ 中的多媒體動態連接庫中提供了一組與音頻設備有關的函數。利用這些函數可以方便地播放聲音。最簡單的播放聲音方法就是直接調用VC++中提供的聲音播放函數BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound ); 或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound );其中參數lpszSound是需要播放聲音的.WAV文件的路徑和文件名, hmod在這里為NULL,fuSound是播放聲音的標志,詳細說明請參考VC++中的幫助。 例如播放C:soundmusic.wav可以用sndPlaySound ("c:\sound\music.wav",SND_ASYNC);或PlaySound("c:\sound\music.wav",NULL, SND_ASYNC|SND_NODEFAULT );如果沒有找到music.wav文件,第一種格式將播放系統默認的聲音,第二種格式不會播放系統默認的聲音。

二.將聲音文件加入到程序中
在VC++的程序設計中,可以利用各種標準的資源,如點陣圖,菜單,對話框等。同時VC++也允許用戶自定義資源,因此我們可以將聲音文件作為用戶自定義資源加入程序資源文件中,經過編譯連接生成EXE文件,實現無.WAV文件的聲音播放。
要實現作為資源的聲音文件的播放,首先要在資源管理器中加入待播放的聲音文件(實現過程並不復雜,這里不在敘述)。假設生成的聲音文件資源標識符為IDR_WAVE1。在播放時只需帶納要調用下面的語句:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(), SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);
其中MAKEINTRESOURCE()宏將整數資源標識符轉變為字元串,AfxGetResourceHandle()函數返回包含資源的模塊句柄,
SND_RESOURCE是必須的標志。
作為資源的聲音文件的第二種播放方法是把資源讀入內存後作為內存數據播放碼中。具體步驟入下:
1.獲得包含資源的模塊句柄:
HMODULE hmod=AfxGetResourceHandle();
2.檢索資源塊信息:
HRSRC hSndResource=FindResource(hmod,MAKEINTRESOURCE(IDR_WAVE1),_T("WAVE"));
3. 裝載資源數據並加鎖:
HGLOBAL hGlobalMem=LoadResource(hmod,hSndResource);
LPCTSTR lpMemSound=(LPCSTR)LockResource(hGlobalMem);
4.播放聲音文件:
sndPlaySound(lpMemSound,SND_MEMORY));
5.釋放資源句柄:
FreeResource(hGlobalMem);

三.播放聲音文件的高級方法
在VC++中提供了一組對音頻設備及多媒體文件直接進行操作的函數。利用這些函數可以靈活地對聲音文件進行各種處理。
首先介紹幾個要用到的數據結構。WAVEFORMATEX結構定義了WAVE音頻數據文件的格式。WAVEHDR結構定義了波形音頻緩沖區。讀出的數據首先要填充此緩沖區才能送音頻設備播放。WAVEOUTCAPS結構描述了音頻設備的性能。MMCKINFO結構包含了RIFF文件中一個塊的信息。詳細的說明請參考VC++中的蠢模沒幫助。
下面給出程序流程簡圖及程序源代碼清單,在VC++環境下可直接使用:

源程序清單如下:
LPSTR szFileName;//聲音文件名
MMCKINFO mmckinfoParent;
MMCKINFO mmckinfoSubChunk;
DWORD dwFmtSize;
HMMIO m_hmmio;//音頻文件句柄
DWORD m_WaveLong;
HPSTR lpData;//音頻數據
HANDLE m_hData;
HANDLE m_hFormat;
WAVEFORMATEX * lpFormat;
DWORD m_dwDataOffset;
DWORD m_dwDataSize;
WAVEHDR pWaveOutHdr;
WAVEOUTCAPS pwoc;
HWAVEOUT hWaveOut;
//打開波形文件
if(!(m_hmmio=mmioOpen(szFileName,NULL,MMIO_READ|MMIO_ALLOCBUF)))
{
//File open Error
Error("Failed to open the file.");//錯誤處理函數
return false;
}
//檢查打開文件是否是聲音文件
mmckinfoParent.fccType =mmioFOURCC(』W』,』A』,』V』,』E』);
if(mmioDescend(m_hmmio,(LPMMCKINFO)&mmckinfoParent,NULL,MMIO_FINDRIFF))
{
//NOT WAVE FILE AND QUIT
}
//尋找 』fmt』 塊
mmckinfoSubChunk.ckid =mmioFOURCC(』f』,』m』,』t』,』 』);
if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK))
{
//Can』t find 』fmt』 chunk
}
//獲得 』fmt 』塊的大小,申請內存
dwFmtSize=mmckinfoSubChunk.cksize ;
m_hFormat=LocalAlloc(LMEM_MOVEABLE,LOWORD(dwFmtSize));
if(!m_hFormat)
{
//failed alloc memory
}
lpFormat=(WAVEFORMATEX*)LocalLock(m_hFormat);
if(!lpFormat)
{
//failed to lock the memory
}
if((unsigned long)mmioRead(m_hmmio,(HPSTR)lpFormat,dwFmtSize)!=dwFmtSize)
{
//failed to read format chunk
}
//離開 fmt 塊
mmioAscend(m_hmmio,&mmckinfoSubChunk,0);
//尋找 』data』 塊
mmckinfoSubChunk.ckid=mmioFOURCC(』d』,』a』,』t』,』a』);
if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK))
{
//Can』t find 』data』 chunk
}
//獲得 』data』塊的大小
m_dwDataSize=mmckinfoSubChunk.cksize ;
m_dwDataOffset =mmckinfoSubChunk.dwDataOffset ;
if(m_dwDataSize==0L)
{
//no data in the 』data』 chunk
}
//為音頻數據分配內存
lpData=new char[m_dwDataSize];
if(!lpData)
{
//faile
}
if(mmioSeek(m_hmmio,SoundOffset,SEEK_SET)<0)
{
//Failed to read the data chunk
}
m_WaveLong=mmioRead(m_hmmio,lpData,SoundLong);
if(m_WaveLong<0)
{
//Failed to read the data chunk
}
//檢查音頻設備,返迴音頻輸出設備的性能
if(waveOutGetDeVCaps(WAVE_MAPPER,&pwoc,sizeof(WAVEOUTCAPS))!=0)
{
//Unable to allocate or lock memory
}
//檢查音頻輸出設備是否能播放指定的音頻文件
if(waveOutOpen(&hWaveOut,DevsNum,lpFormat,NULL,NULL,CALLBACK_NULL)!=0)
{
//Failed to OPEN the wave out devices
}
//准備待播放的數據
pWaveOutHdr.lpData =(HPSTR)lpData;
pWaveOutHdr.dwBufferLength =m_WaveLong;
pWaveOutHdr.dwFlags =0;
if(waveOutPrepareHeader(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0)
{
//Failed to prepare the wave data buffer
}
//播放音頻數據文件
if(waveOutWrite(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0)
{
//Failed to write the wave data buffer
}
//關閉音頻輸出設備,釋放內存
waveOutReset(hWaveOut);
waveOutClose(hWaveOut);
LocalUnlock(m_hFormat);
LocalFree(m_hFormat);
delete [] lpData;
說明:1)以上使用的音頻設備和聲音文件操作函數的聲明包含在mmsystem.h頭文件中,因此在程序中必須用#include "mmsystem.h"語句加入頭文件。同時在編譯時要加入動態連接導入庫winmm.lib,具體實現方法是從Developer Studio的Project菜單中選擇Settings,然後在Link選項卡上的Object/Library Moles控制中加入winmm.lib。2)在pWaveOutHdr.lpData中指定不同的數據,可以播放音頻數據文件中任意指定位置的聲音。3) 以上程序均在VC++6.0中調試通過,在文中省略了對錯誤及異常情況的處理,在實際應用中必須加入。
四.結論
在VC++中可以根據應用需要採用不同的方法播放聲音文件。簡單應用可以直接調用聲音播放函數。第二種方法可以把聲音作為資源加入可執行文件中。如果在播放之前要對聲音數據進行處理,可用第三種方法。

閱讀全文

與loword頭文件相關的資料

熱點內容
t8cad文件怎麼打開 瀏覽:275
英語趣配音網路未連接 瀏覽:740
linuxdeb文件安裝 瀏覽:153
word如何在箭頭上寫字 瀏覽:821
安全刪除數據為什麼要重寫硬碟 瀏覽:873
稅務系統網路與信息安全應急保障工作框架 瀏覽:407
淘寶背景代碼生成 瀏覽:649
小學特色託管編程圖形如何 瀏覽:748
編程實驗分析怎麼寫 瀏覽:58
滑鼠編程宏怎麼設置 瀏覽:100
怎麼清除百度登錄過網站 瀏覽:503
linuxl2 瀏覽:116
蘋果升級一直重啟怎麼解決 瀏覽:827
農商銀行app怎麼登錄不上去 瀏覽:47
查看已連接寬頻密碼 瀏覽:822
日本創建購物網站需要什麼 瀏覽:723
數據拐點什麼時候出來 瀏覽:640
怎麼做到徹底理解編程語言 瀏覽:167
機器人和程序編程哪個好 瀏覽:563
怎麼改蘋果手機icloud賬號和密碼 瀏覽:526

友情鏈接