zoukankan      html  css  js  c++  java
  • <Win32_12>程序员求爱的创意程序——升级版^_^

    前段时间,我编写了一个创意程序,并用于向自己目前的女朋友表白,结果效果还不错,得到了她的芳心。

    于是我将自己的创意程序共享到csdn资源上,大多数网友认为创意不错,就是简单了些——呵呵,其实我个人也这么觉得,只不过当时时间和能力的限制,也就那样将就了

    ……

    点击下载第一次的程序

    ……

    而今呢,我在七夕节时再次为我的女朋友写了一个程序,这次算是上次的升级版吧,功能多了一些、界面效果也好多了

    下面,我们就来欣赏一下它的效果吧

    (这次的目的和上次一样,只是做一个模本,所以我仅仅是使用了上次的诗歌和一首最近比较火的歌曲<<谁>>(吴佳唱的,电视剧<<生死相依>>的主题曲),留给大家创作的空间^_^)

    *************************************************程序及源代码欣赏******************************************************

    (1)开始弹出一个消息框,点击"是"继续,点击"否"直接退出

     

    (2)选择"是"之后2秒钟,显示主窗口的界面

     

    (3)这里在主窗口中建立了三个子窗口,这个一眼就能看见,就不言而喻了——我还是将三个子窗口的窗口回调函数代码贴出来,内涵注释

    a)诗歌子窗口(左边长方形的那个)

    //诗歌子窗口回调函数(动态显示诗歌、播放音乐(音乐可自行选择))
    LRESULT CALLBACK PoemChild(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	static	HBITMAP	hBmp;
    	static	HFONT	hFont;
    	static	int		cxBitmap, cyBitmap;
    	static	HWND	hwndMci;
    	BITMAP			bmp;
    	LOGFONT			lf;
    	HDC				hdc, hdcMem;
    	PAINTSTRUCT		ps;
    	TEXTMETRIC		tm;
    
    	switch(message)
    	{
    	case WM_CREATE:
    		//开始加载并播放音乐(使用MCI控件)
    		hwndMci = MCIWndCreate(hwnd, ((LPCREATESTRUCT)lParam)->hInstance,
    							MCIWNDF_SHOWNAME,TEXT("谁.mp3"));
    		
    		ShowWindow(hwndMci, SW_HIDE);
    		MCIWndPlay(hwndMci);
    
    		//加载位图
    		hBmp = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDB_BMPPOEM));
    		GetObject(hBmp, sizeof(BITMAP), &bmp);
    
    		cxBitmap = bmp.bmWidth;
    		cyBitmap = bmp.bmHeight;
    
    		/**********************获取系统文本参数*************************/
    		hdc = GetDC(hwnd);
    
    		GetTextMetrics(hdc, &tm);
    		cxChar = tm.tmAveCharWidth;
    		cyChar = tm.tmHeight;
    
    		ReleaseDC(hwnd, hdc);
    
    		//设定计时器
    		SetTimer(hwnd, ID_TIMER_POEM, 400, NULL);
    
    		//创建字体
    		ZeroMemory(&lf, sizeof(LOGFONT));
    
    		lf.lfHeight		= -15;
    		lf.lfUnderline	= 1;
    
    		hFont = CreateFontIndirect(&lf);
    
    		//打开诗歌文件
    		if((fp = fopen("res\Poem.txt", "r")) == NULL)
    		{
    			MessageBox(hwnd, TEXT("不好意思,我找不到优美的诗歌了o(╯□╰)o"), TEXT("提示"), MB_OK);
    			exit(1);
    		}
    		row = col = 0;
    		return 0 ;
    
    	//绘制背景位图
    	case WM_PAINT:
    		hdc = BeginPaint(hwnd, &ps);
    
    		hdcMem = CreateCompatibleDC(hdc);
    		SelectObject(hdcMem, hBmp);
    
    		BitBlt(hdc, 0, 0, cxBitmap, cyBitmap, hdcMem, 0, 0, SRCCOPY);
    
    		DeleteDC(hdcMem);
    		EndPaint(hwnd, &ps);
    		return 0;
    
    	//通过响应鼠标消息来控制MCI播放器的显示和隐藏
    	case WM_LBUTTONDOWN:
    		if(IsWindowVisible(hwndMci))
    		{
    			ShowWindow(hwndMci, SW_HIDE);
    		}
    
    		else
    		{
    			ShowWindow(hwndMci, SW_NORMAL);
    		}
    		return 0;
    
    	//通过定时器来驱动诗歌的显示
    	case WM_TIMER:
    		hdc = GetDC(hwnd);
    
    		//设定文本颜色
    		SetTextColor(hdc, RGB(rand() % 255,
    			rand() % 205, rand() % 255));
    		SetBkMode(hdc,TRANSPARENT);//设定文本的背景透明
    
    		SelectObject(hdc, hFont);
    
    		//如果文件读取完了 , 计时器也应该关闭 , 免得浪费资源
    		if(ShowWord(hdc) == EOF)
    		{
    			KillTimer(hwnd, ID_TIMER_POEM);
    		}
    		
    		ReleaseDC(hwnd, hdc);
    		return 0;
    
    	case WM_DESTROY:
    		MCIWndDestroy(hwndMci);//关闭MCI控件
    		DeleteObject(hFont);
    		DeleteObject(hBmp);
    		PostQuitMessage(0);
    		return 0;
    	}
    
    	return DefWindowProc(hwnd, message, wParam, lParam);
    }


    b)右上角子窗口

    //动画位图子窗口回调函数
    LRESULT CALLBACK LoveChild(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	static HBITMAP	hBmp[NUM];
    	static POINT	bmpPos[NUM];
    	static int		moveIndex[NUM] = {5, 5, 5};
    	static WORD		bmpID[] = {IDB_BMPI, IDB_BMPLOVE, IDB_BMPYOU};
    	static int		cxClient, cyClient, cxBitmap, cyBitmap;
    	BITMAP			bmp;
    	HDC				hdc, hdcMem;
    	PAINTSTRUCT		ps;
    	int				i;
    
    	switch(message)
    	{
    	case WM_CREATE:
    		//设置计时器
    		SetTimer(hwnd, ID_TIMER_LOVE, 100, NULL);
    
    		//加载位图
    		for(i=0; i<NUM; i++)
    		{
    			hBmp[i] = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance, 
    								MAKEINTRESOURCE(bmpID[i]));
    			bmpPos[i].x = bmpPos[i].y = -10;
    		}
    
    		GetObject(hBmp[0], sizeof(BITMAP), &bmp);
    
    		cxBitmap = bmp.bmWidth;
    		cyBitmap = bmp.bmHeight;
    		return 0;
    
    	case WM_SIZE:
    		cxClient = LOWORD(lParam);
    		cyClient = HIWORD(lParam);
    
    		//修改位图位置
    		for(i=0; i<NUM; i++)
    		{	
    			bmpPos[i].x = cxClient * i / 3;
    			if(bmpPos[i].x == -10)
    			{
    				bmpPos[i].y = rand() % (cyClient - cyBitmap);
    			}
    		}
    		return 0;
    
    	case WM_PAINT:
    		hdc = BeginPaint(hwnd, &ps);
    
    		hdcMem = CreateCompatibleDC(hdc);
    
    		for(i=0; i<NUM; i++)
    		{
    			//判断位图的位置  并作相应的运动方向的改变
    			if(bmpPos[i].y < 0)//上边界
    			{
    				moveIndex[i] = rand() % 10 + 5;
    			}
    
    			if(bmpPos[i].y >= (cyClient - cyBitmap))//下边界
    			{
    				moveIndex[i] = - (rand() % 10 + 5);
    			}
    
    			bmpPos[i].y += moveIndex[i];
    
    			SelectObject(hdcMem, hBmp[i]);
    
    			BitBlt(hdc, bmpPos[i].x, bmpPos[i].y, 
    				cxBitmap, cyBitmap, hdcMem, 0, 0, SRCCOPY);
    		}
    
    		DeleteDC(hdcMem);
    		EndPaint(hwnd, &ps);
    		return 0;
    
    	case WM_TIMER:
    		InvalidateRect(hwnd, NULL, FALSE);//设置无效区域  但是不重绘背景(FALSE)
    		return 0;
    
    	case WM_DESTROY:
    		KillTimer(hwnd, ID_TIMER_LOVE);
    		
    		for(i=0; i<NUM; i++)
    		{
    			DeleteObject(hBmp[i]);
    		}
    		
    		PostQuitMessage(0);
    		return 0;
    	}
    	return DefWindowProc(hwnd, message, wParam, lParam);
    }


    c)右下角子窗口

    //动态变换位图子窗口回调函数
    LRESULT CALLBACK BmpChild(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	static HBITMAP	hBmp[10];
    	static WORD		bmpID[] = {IDB_BITMAP4, IDB_BITMAP5, IDB_BITMAP6, IDB_BITMAP7,
    							   IDB_BITMAP8, IDB_BITMAP9, IDB_BITMAP10, IDB_BITMAP11,
    							   IDB_BITMAP12, IDB_BITMAP13};
    	static int		cxBitmap, cyBitmap, curBmpIndex;
    	BITMAP			bmp;
    	HDC				hdc, hdcMem;
    	PAINTSTRUCT		ps;
    	int				i;
    
    	switch(message)
    	{
    	case WM_CREATE:
    		//设置计时器
    		SetTimer(hwnd, ID_TIMER_BMP, 5000, NULL);
    
    		//加载位图
    		for(i=0; i<10; i++)
    		{
    			hBmp[i] = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance, 
    								MAKEINTRESOURCE(bmpID[i]));
    		}
    
    		GetObject(hBmp[0], sizeof(BITMAP), &bmp);
    
    		cxBitmap = bmp.bmWidth;
    		cyBitmap = bmp.bmHeight;
    		return 0;
    
    	case WM_PAINT:
    		hdc = BeginPaint(hwnd, &ps);
    
    		hdcMem = CreateCompatibleDC(hdc);
    
    		SelectObject(hdcMem, hBmp[curBmpIndex]);
    
    		BitBlt(hdc, 3, 8, cxBitmap, cyBitmap, hdcMem, 0, 0, SRCCOPY);
    
    		curBmpIndex = (curBmpIndex + 1) % 10;
    
    		DeleteDC(hdcMem);
    		EndPaint(hwnd, &ps);
    		return 0;
    
    	case WM_TIMER:
    		InvalidateRect(hwnd, NULL, TRUE);
    		return 0;
    
    	case WM_DESTROY:
    		KillTimer(hwnd, ID_TIMER_BMP);
    
    		for(i=0; i<10; i++)
    		{
    			DeleteObject(hBmp[i]);
    		}
    
    		PostQuitMessage(0);
    		return 0;
    	}
    	return DefWindowProc(hwnd, message, wParam, lParam);
    }

     

    (4)另外,本次使用了Win32的MCI控件,基本上可以播放任意格式的音频文件

    (点击左边长方形子窗口,可以控制这个控件的显示和隐藏)

    至于这个控件的使用方法,相信大家能很快了解到,不需要我赘述了

    从这个方面来讲,本次的程序还是一个建议的背景音乐播放器

    ok,因为大部分技术都是之前讲过的,例如:贴位图、计时器、子窗口==,因此就这样初略地讲一下吧……

    希望我的程序能给程序员们带来灵感,愿天下有情人终成眷属^_^

    点击下载程序和源代码

  • 相关阅读:
    Flume案例
    推荐算法
    Hive安装
    打开相机
    打电话,发短信
    温度传感器,摇一摇
    经度,纬度,获取
    团队站立会议01
    团队项目计划会议
    "群英队"电梯演讲
  • 原文地址:https://www.cnblogs.com/riskyer/p/3268766.html
Copyright © 2011-2022 走看看