㈠ 如何用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++中可以根据应用需要采用不同的方法播放声音文件。简单应用可以直接调用声音播放函数。第二种方法可以把声音作为资源加入可执行文件中。如果在播放之前要对声音数据进行处理,可用第三种方法。