Windows
窗体程序是基于消息机制的,所有控件,它的本质都是一个窗体,都是使用
CreateWindows
函数来创建,不过类名,则需要指定为系统预先注册的控件类,比如,你要创建一个按钮控件,就要这样子
CreateWindows(
"BUTTON",
"按钮标题"
),CreateWindows
这个函数你应该用了不少了吧,其余的参数可以参考
MSDN,但是类名我们指定了
“BUTTON”,说明我们要创建一个按钮,每个按钮都有一个唯一的
ID,通过你的消息处理函数,可以知道哪个按钮发生了什么事件,详细讲的话,非常多,你可以参考
MSDN,或者《Windows
程序设计》这本书
。
一:NET中窗体应用程序就是一种GUI程序
窗体创建的两种方式:
(1)自动生成的是:
[csharp] view plain copy print
ApplicationRun(new Form1());
相当于:
[csharp] view plain copy print
Form1 f = new Form1();
ApplicationRun(f);
(2)显示新的窗体
[csharp] view plain copy print
Form2 f = new Form2( );
fShow();
二;事件
Windows 系统中处处是事件:
鼠标按下
鼠标释放
键盘键按下……
Windows 通过随时响应用户触发的事件做出相应的响应——事件驱动机制
WinForms 应用程序也是事件驱动的
开发人员针对感兴趣的事件,编写相应的事件处理程序
编写事件处理程序::::
1、选中控件
2、在“属性”窗口中单击“闪电”图标
3、找到要处理的事件
4、生成事件处理方法
5、编写处理代码
例:随鼠标移动,显示鼠标当前坐标
点击选中窗体
属性窗体中找到MouseMove事件
双击事件生成事件处理程序框架
编写代码
[csharp] view plain copy print
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
thisText = stringFormat("鼠标位置({0},{1})", eX, eY);
}
运行图;
常用窗体事件
Load :窗体加载事件(即将显示尚未显示),常用作初始化功能
Click事件:鼠标单击事件
DoubleClick事件:鼠标双击事件
MouseMove :鼠标移动事件
KeyDown :键盘按下事件
KeyUp :键盘释放事件
小例子:单击窗体计1分,双击窗体计10分,编写程序,随时显示得分总数。
定义变量n存储分数,初值为0
单击事件click中n+1,并刷新
双击事件DoubleClick中n+10,并刷新
在窗体上设置单击
[csharp] view plain copy print
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
n += 1;
string s = stringFormat("得分{0}", n);
thisText = s;
}
运行如下:
双击如下;
[csharp] view plain copy print
private void Form1_MouseDoubleClick(object sender, MouseEventArgs e)
{
n += 10;
string s = stringFormat("得分{0}", n);
thisText = s;
}
运行图;
这个还有点缺陷,双击本该是23,但却成啦24,双击时记上的单击的那下
(2)菜单控件
创建菜单的步骤:
1、切换设计器
2、工具箱→所有 Windows 窗体
3、向窗体添加 MenuStrip 控件
4、设置菜单的属性和事件
设计学生管理菜单,注意菜单分隔条的设计
实现“退出”功能
关闭窗体,调用窗体类的Close方法
关闭当前窗体 thisClose( );
[csharp] view plain copy print
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
thisClose();
}
修改文件programcs,照以下的文件改下:
///
///
应用程序的主入口点。
///
[stathread]
static
void
main()
{
applicationenablevisualstyles();
applicationsetcompatibletextrenderingdefault(false);
applicationrun(new
新窗体的类名);
}
具体如下 :
新建一个对话框资源,比如Dlg;在OnButton()响应函数下。
在窗口托一个button。
给button加一个单击响应函数 OnButton()。
Windows下选择原生态的SDK(看《windows程序设计》),或者开发效率更高的MFC(运行效率低一点、也比较庞杂),或者WTL。Duilib可以结合后两者使用。
跨平台的解决方案就多了。Qt自不用说。从linux上过来的GTK+、wx(这两者我未接触过)也可以。比较小众的还有FLTK、SDL(做多媒体程序、游戏比较适合)、SFML等等。
就是建一个工程:
打开VC++,执行“文件”——“新建”命令,单击“Win32 Console Application”选项后,在“工程”文本框中输入“prog10_1”,在“位置”中选择“c:\programming”后,“位置”文本框中即显示“c:\programming\prog10_1”选择“创建新工作区”选项,单击“确定”按钮后,在选择“An empty project”选项,即建立了一个工程。
添加源程序:
执行“工程”——'添加工程"命令,在file中选择prog10_1cpp,并以同样方式选择prog10_1_2cpp和prog10_1_3cpp后,就将三个源文件全部添加到了工程中。在左侧窗口中单击"File view"选项卡,再单击"Source File",此时双击某个源文件名,在右侧窗口中即显示相应的源程序。
生产窗体可以使用CreateWindowEx函数。
函数功能:该函数创建一个具有扩展风格的层叠式窗口、d出式窗口或子窗口,其他与CreateWindow函数相同。
函数原型:
CreateWindowEx函数创建一个层叠的,自动d出的(pop-up)或是一个子窗口通过扩展格式。另外这个函数的作用与CreateWindow函数的作用相同。要获得更多的关于创建窗口的信息和关于CreateWindowEx函数参数的详细描述。参见CreateWindow
HWND CreateWindowEx(
DWOR DdwExStyle, //窗口的扩展风格
LPCTSTR lpClassName, //指向注册类名的指针
LPCTSTR lpWindowName, //指向窗口名称的指针
DWORD dwStyle, //窗口风格
int x, //窗口的水平位置
int y, //窗口的垂直位置
int nWidth, //窗口的宽度
int nHeight, //窗口的高度
HWND hWndParent, //父窗口的句柄
HMENU hMenu, //菜单的句柄或是子窗口的标识符
HINSTANCE hInstance, //应用程序实例的句柄
LPVOID lpParam //指向窗口的创建数据
);
例程:
include<windowsh>#include<stdioh>
LRESULT CALLBACK WinDouProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
class CWnd
{
public:
CWnd()
{
m_hWnd = NULL;
}
BOOL CreateEx(
DWORD dwExStyle, // extended window style
LPCTSTR lpClassName, // pointer to registered class name
LPCTSTR lpWindowName, // pointer to window name
DWORD dwStyle, // window style
int x, // horizontal position of window
int y, // vertical position of window
int nWidth, // window width
int nHeight, // window height
HWND hWndParent, // handle to parent or owner window
HMENU hMenu, // handle to menu or child-window identifier
HANDLE hInstance, // handle to application instance
LPVOID lpParam // pointer to window-creation data
);
BOOL ShowWindow( int nCmdShow );
BOOL UpdateWindow();
public:
HWND m_hWnd;
};
BOOL CWnd::CreateEx(
DWORD dwExStyle, // extended window style
LPCTSTR lpClassName, // pointer to registered class name
LPCTSTR lpWindowName, // pointer to window name
DWORD dwStyle, // window style
int x, // horizontal position of window
int y, // vertical position of window
int nWidth, // window width
int nHeight, // window height
HWND hWndParent, // handle to parent or owner window
HMENU hMenu, // handle to menu or child-window identifier
HANDLE hInstance, // handle to application instance
LPVOID lpParam // pointer to window-creation data
)
{
m_hWnd = ::CreateWindowEx (dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,(HINSTANCE)hInstance,lpParam);
if(m_hWnd != NULL)
return TRUE;
else
return FALSE;
}
BOOL CWnd::ShowWindow(int nCmdShow)
{
return ::ShowWindow(m_hWnd,nCmdShow);
}
BOOL CWnd::UpdateWindow()
{
return ::UpdateWindow(m_hWnd);
}
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // pointer to command line
int nCmdShow // show state of window
)
{
WNDCLASS wndclass; //先设计窗口类
wndclasscbClsExtra = 0;
wndclasscbWndExtra = 0;
wndclasshbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);
wndclasshCursor = LoadCursor(NULL,IDC_HELP);
wndclasshIcon = LoadIcon(NULL,IDI_WARNING);
wndclasshInstance = hInstance;
wndclasslpfnWndProc = WinDouProc;
wndclasslpszClassName = "Magic_Maggie";
wndclasslpszMenuName = 0;
wndclassstyle = CS_VREDRAW | CS_HREDRAW;
//某一个变量原油几个变量去掉一个特征,可以用取反(~)后再进行与(&)
//例如:style上去掉CS_NOCLOSE,可以style&~CS_NOCLOSE;
RegisterClass(&wndclass); ///注意先建立再注册昂
CWnd wnd;
wndCreateEx(NULL,"Magic_Maggie","DouDou",WS_OVERLAPPEDWINDOW,0,0,800,600,NULL,NULL,hInstance,NULL);
wndShowWindow(SW_SHOWNORMAL);
wndUpdateWindow();
MSG msg; //消息循环
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg); //触发WinDouProc
}
return 0;
}
LRESULT CALLBACK WinDouProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_LBUTTONDOWN:
MessageBox(hwnd,"您按下了鼠标左键昂","豆豆的程序",MB_OK);
HDC hdc;
hdc = GetDC(hwnd);
//The GetDC function retrieves a handle to a display device context for the client area of a specified window or for the entire screen You can use the returned handle in subsequent GDI functions to draw in the device context
TextOut(hdc,0,0,"感谢您对豆豆程序的支持昂",strlen("感谢您对豆豆程序的支持昂"));
ReleaseDC(hwnd,hdc);
break;
case WM_CHAR:
char szChar[20];
sprintf(szChar,"Char is %d",wParam);
MessageBox(hwnd,szChar,"豆豆的程序",MB_OK);
break;
case WM_PAINT:
PAINTSTRUCT ps;
HDC hDc;
hDc = BeginPaint(hwnd,&ps);
TextOut(hDc,0,0,"这个是重绘滴哦",strlen("这个是重绘滴哦"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE: //这个case与下边的destroy这个case不要弄错了,否则窗口不出现,但任务管理器中运行
if(IDYES == MessageBox(hwnd,"您真的要退出么","豆豆的程序",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
//////////////////////////////////////////
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam); // 别忘记了return
}
return 0;
}
定义一个Timer,设置timer的Interval属性为1000毫秒,启用timer。在timer的tick事件中加入
private void timer1_Tick(object sender, EventArgs e){
Random r = new Random();
thisBackColor = ColorFromArgb(255, rNext(256), rNext(256), rNext(256));
}
窗体背景每隔1秒会随机变换一种颜色
以上就是关于用C语言编写windows窗体程序,怎么创建按钮以及怎么添加按钮的触发事件啊全部的内容,包括:用C语言编写windows窗体程序,怎么创建按钮以及怎么添加按钮的触发事件啊、c#窗体程序设计中clientsize怎样使用、如何用c sharp语言编写九九乘法表的窗体应用程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)