【对话框编程】C语言也能干大事系列课程源代码

这是一个关于C语言进行对话框编程的系列课程,包括MessageBox窗口程序、对话框应用、简易加法计算器的开发,涉及Visual Studio和C-Free 5.0编译器。课程中还解决了EDIT3控件乱码问题,并逐步改进计算器功能,添加了定时器和记事本、播放器等实用功能。
摘要由CSDN通过智能技术生成



第一节 MessageBox程序

窗口恶搞程序:

【编译器】C-Free 5.0

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	/* TODO: Place code here.*/
 	int a,b = 4;
 	while(IDRETRY == b)
 	{
	 	a = MessageBox(NULL,TEXT("你是好人吗"),TEXT("窗口"),MB_YESNO);
    	if(IDNO == a)
    	{
    		b = MessageBox(NULL,TEXT("看你就不像好人,点击确定开始格式化C盘!"),TEXT("窗口"),MB_OK|MB_ICONINFORMATION);
    	}
    	else
    	{
    		b = MessageBox(NULL,TEXT(""),TEXT("窗口"),MB_RETRYCANCEL); 
    	}
    	if(IDOK == b)
    	{
    		MessageBox(NULL,TEXT("C盘格式化完毕!"),TEXT("窗口"),MB_OK);
    	}
	}
	return 0;
}


第二节 对话框程序

【编译器】Visual Studio 2010

#include "stdafx.h"
#include "test2.h"
#include "Resource.h"

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	DialogBox(hInstance,MAKEINTRESOURCE(IDD_ABOUTBOX),NULL,NULL);
	return 0;
}

第三节 简易加法计算器

【编译器】Visual Studio 2010

【问题】EDIT3控件输出乱码

头文件添加如下声明:

//SimpleAddPro.h

BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam);
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
void Main_OnClose(HWND hwnd);


另外标准头文件添加:

//stdafx.h

#include <windowsx.h>

主文件:

// SimpleAddPro.cpp : 定义应用程序的入口点。
#include "stdafx.h"
#include "SimpleAddPro.h"
#include "Resource.h"

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	DialogBox(hInstance,MAKEINTRESOURCE(IDD_ABOUTBOX),NULL,Main_Proc);
	return 0;
}

BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
  HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
  HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
  HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
}
return FALSE;
}
//对话框窗口初始化函数:
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
return TRUE;
}
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
case IDC_OK:
  {
	  TCHAR str1[256];
	  TCHAR str2[256];
	  GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1));
	  GetDlgItemText(hwnd,IDC_EDIT2,str2,sizeof(str2));
	  int n1=_wtoi(str1);
	  int n2=_wtoi(str2);
	  int n3=n1+n2;
	  TCHAR str3[256];
	  //wsprintf(str3,"%d",n3);
	  _itow(n3,str3,10);
	  SetDlgItemText(hwnd,IDC_EDIT3,str3);
  }
  break;
default:
  break;
}
}
void Main_OnClose(HWND hwnd)
{
EndDialog(hwnd, 0);
}

问题解决!VC++6.0中的atoi函数和itoa函数在VS2010中始终存在各种问题,原因及解决方法如下:
1.vs 2010 默认字符集是使用 Unicode 字符集,而vc++ 6.0 没有Unicode 字符集。
2.vc++ 6.0 char类型采用的是单字节存储形式,而vs 2010为了兼容发展,采用了2字节存储形式那么,在vs 2010中字符串与数字互换的写法是怎么样的呢,其实也简单,我们了解VS2010的char的存储机制后,我们可用宽字节的宏来转换,即用 wchar_t(TCHAR)代替 char 字义字符串,用_wtoi 字符串转整数,用_itow 整数转字符串就可以了


Dialog控件略。


第四节 简易计算器改进
数值是否合法判断函数:

BOOL IsInt(TCHAR* str)
{
	int i=_wtoi(str);
	TCHAR strtemp[256];
	wsprintf(strtemp,"%i",i);
	if(strcmp(str,strtemp)!=0)
	{
		return FALSE;
	}
	else
	{
		return TRUE;
	}
}

第四节 简易计算器2.0

【编译器】Visual Studio 2010

此版本在之前的版本上修改,以下为修改内容:

1.初始化函数添加Combo下拉选项

BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
	HWND hwndCombo1 = GetDlgItem(hwnd,IDC_COMBO1);//获取Combo句柄
	ComboBox_InsertString(hwndCombo1,-1,TEXT("+"));
	ComboBox_InsertString(hwndCombo1,-1,TEXT("-"));
	ComboBox_InsertString(hwndCombo1,-1,TEXT("*"));
	ComboBox_InsertString(hwndCombo1,-1,TEXT("/"));
return TRUE;
}

2.计算部分,替代1.0版本中的相加赋值语句

	  HWND hwndCombo1 = GetDlgItem(hwnd,IDC_COMBO1);
	  int curIndex = ComboBox_GetCurSel(hwndCombo1);
	  switch(curIndex)
	  {
		  case 0:
		  {
			  n3 = n1+n2;
		  }
		  break;
		  case 1:
		  {
			  n3 = n1-n2;
		  }
		  break;
		  case 2:
		  {
			  n3 = n1*n2;
		  }
		  break;
		  case 3:
		  {
			  n3 = n1/n2;
		  }
		  break;
	  }

另外,Dialog主控件属性Center(窗口初始居中)、Maximize Box(最大化按钮)、 Minimize Box(最小化按钮)等调节为Ture值可用。


第六节 定时器

时钟1.0

//回调函数
void CALLBACK TimeProc(HWND hwnd,UINT message,UINT iTimerID,DWORD dwTIME)
{
	SYSTEMTIME stLocal;//系统时间指针
	GetLocalTime(&stLocal);
	TCHAR strTime[256];
	wsprintf(strTime,TEXT("%d年%d月%d日 %d:%d:%d"),stLocal.wYear,stLocal.wMonth,stLocal.wDay,stLocal.wHour,stLocal.wMinute,stLocal.wSecond);
	SetDlgItemText(hwnd,IDC_EDITTIME,strTime);
}

BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
	SetTimer(hwnd,0,1000,TimeProc);//定时器
return TRUE;
}


第七节 记事本和播放器

1.打开文件代码

case IDM_OPEN://打开
{
	OPENFILENAME ofn;//结构体变量
	TCHAR szFile[MAX_PATH];
	ZeroMemory(&ofn,sizeof(ofn));
	ofn.lStructSize=sizeof(ofn);
	ofn.lpstrFile=(LP)szFile;
	ofn.lpstrFile[0]=TEXT('\0');
	ofn.nMaxFile=sizeof(szFile);
	ofn.lpstrFilter=TEXT("所有文件(*.*)\0*.*\0文本文档(*.txt)\0*.TXT\0");
	ofn.nFilterIndex=2;
	ofn.lpstrFileTitle=NULL;
	ofn.nMaxFileTitle=0;
	ofn.lpstrInitialDir=NULL;
	ofn.hwndOwner=hwnd;//父窗口
	ofn.Flags=OFN_EXPLORER|OFN_PATHMUSTEXIST;
	if(GetOpenFileNameW(&ofn))//打开文件API,返回路径在szFile变量内,返回值类型为BOOL
	{
		FILE * fp = fopen(szFile,"r");//此部分无法在VS2010运行
		char line[256];
		fgets(line,sizeof(line),fp);
		fclose(fp);
		SetDlgItemText(hwnd,IDC_EDIT,line);
	}

2.对话框退出函数

case IDM_EXIT://退出
{
	EndDialog(hwnd,0);
}

3.RICH EDIT 2.0控件调用

LoadLibrary(TEXT("riched32.dll"));//在winMain函数中调用




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值