vc常用代码1
扫描二维码
随时随地手机看文章
VC常用代码
分类: VC 学习2009-03-07 15:28 1114人阅读 评论(0) 收藏 举报
===========================================================
//注意事项
//先执行OnInitDialog()函数,然后执行构造函数!
//98下没有新宋体
//XP下窗口高度加8
===========================================================
………1,滚动条处理方法
//1,设置范围
m_spscroll.SetScrollRange(0,200);
SCROLLINFO si;
si.cbSize=sizeof(SCROLLINFO);
si.nPage=100;
si.fMask=SIF_PAGE;//设置页宽
m_spscroll.SetScrollInfo(&si);
//2,处理消息,垂直滚动条加WM_VSCROLL消息,水平加WM_HSCROLL消息
void CPrintView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
if(pScrollBar->GetDlgCtrlID()==IDC_SCROLLBAR1)
{
int nCurrentPos=pScrollBar->GetScrollPos();
SCROLLINFO si;
si.fMask=SIF_PAGE;//取得页宽
pScrollBar->GetScrollInfo(&si);
switch(nSBCode)
{
case SB_THUMBTRACK://移动滑块
case SB_THUMBPOSITION:
pScrollBar->SetScrollPos(nPos); //设置页宽后滚动条的pos会以max/nPage倍数减少,所以在使用时注意把pos值*(max/nPage)能得到原值
break;
case SB_LINEUP://点向上小三角
pScrollBar->SetScrollPos(nCurrentPos-1);
break;
case SB_LINEDOWN://点向下小三角
pScrollBar->SetScrollPos(nCurrentPos+1);
break;
case SB_PAGEUP://向上一页
pScrollBar->SetScrollPos(nCurrentPos-si.nPage);
break;
case SB_PAGEDOWN://向下一页
pScrollBar->SetScrollPos(nCurrentPos+si.nPage);
break;
}
}
CDialog::OnVScroll(nSBCode, nPos, pScrollBar); {}
………2,锁定鼠标
bool pOld;
CRect rt;
SetForegroundWindow();
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&pOld,SPIF_UpdateINIFILE);
GetWindowRect(rt);
ClipCursor(rt);
//加到 LRESULT CLockDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 会有意外的效果
………3,在列表字符前插入一个负数字符以修改乱码
int index=m_list.GetSelectionMark();//在列表字符前插入一个负数字符以修改乱码
CString cs;
cs=m_list.GetItemText(index,0);
char insert_char=-87;
cs.Insert(0,insert_char);
m_list.SetItemText(index,0,cs);
………4,在列表中添加项目最大只能显示259个字符(不含'/0')
int char_length=cs.GetLength();//cs,ct为CString类对象,是要发到列表框的文本但是可能大于259字节
while(char_length>259)//如果大于259字节
{
ct=cs.Left(259);
m_list.InsertItem(0,ct);//在列表中添加项目最大只能显示259个字符(不含'/0')
cs=cs.Right(char_length-259);
char_length=cs.GetLength();
}
m_list.InsertItem(0,cs);//在列表中添加项目最大只能显示259个字符(不含'/0')
………5,设置NT窗口的透明度
OSVERSIONINFO osv;
osv.dwOSVersionInfoSize=sizeof OSVERSIONINFO;
GetVersionEx(&osv);//取得版本信息
if(osv.dwPlatformId==VER_PLATFORM_WIN32_NT)//VER_PLATFORM_WIN32_WINDOWS 98 Me用这个宏
{
//加入WS_EX_LAYERED扩展属性
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);//如果多次调用下面这个函数设置,这个函数只在一个位置调用一次就行了
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
//取得SetLayeredWindowAttributes函数指针
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if(fun)fun(this->GetSafeHwnd(),0, 200,//0 ~ 2552);
FreeLibrary(hInst);
}
}
………6,字体对话框的初始化
LOGFONT lf;
lf.lfHeight=-35;
lf.lfCharSet=134;
lf.lfWeight=400;
lf.lfOutPrecision=3;
lf.lfClipPrecision=2;
lf.lfQuality=1;
lf.lfPitchAndFamily=2;
strcpy(lf.lfFaceName,"宋体");//以上初始化为宋体26号字
CFontDialog cf(&lf);//字体
cf.m_cf.rgbColors=textcolor;//颜色
………7,移动没有标题的窗口
//1定义:
CPoint just_point;
//2
void CClockfortecherDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
just_point=point;
CDialog::OnLButtonDown(nFlags, point);
}
//3
void CClockfortecherDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
WINDOWPLACEMENT wi;
GetWindowPlacement(&wi);
if(nFlags==MK_LBUTTON)
SetWindowPos(&wndTop,wi.rcNormalPosition.left+(point.x-just_point.x), wi.rcNormalPosition.top+(point.y-just_point.y),
0,0,SWP_NOSIZE);
CDialog::OnMouseMove(nFlags, point);
}
………8,线程与信号量
//1,定义信号量句柄
HANDLE event;
//2,创建信号量
event=CreateEvent(NULL, TRUE, FALSE, NULL);
//3,创建线程:
//1)定义线程函数,格式必须如下,其中lParam为AfxBeginThread的第二个参数值,可强制转化成所需类型
UINT WorkThreadProc(LPVOID lParam)//必须是 UINT XXX..XXX(LPVOID lParam)
{
//代码示例WaitForSingleObject:
while(1)
{
//注意,如果线程间要求同步或互斥的时候,要在每一层循环体中加入WaitForSingleObject
WaitForSingleObject((HANDLE)lParam, INFINITE);
//WaitForSingleObject的使用方法:第一个为信号量HANDLE,是CreateEvent的返回值,第二个参数为等待的毫秒数(1/1000秒)
//第二个参数为INFINITE时则一直等待,直到调用SetEvent()设置信号量时函数返回;为数值(如1000)则函数在1秒后返回
//(即使你没调用SetEvent()设置信号量)
AfxMessageBox("fuck");//不能用MessageBox()因为这不是在类中了...
ResetEvent((HANDLE)lParam);
//重置信号量,以使WaitForSingleObject函数可以继续等待,否则(如果你已经调用过了SetEvent()设置了信号量)
//WaitForSingleObject函数将会立刻返回
}
}
//2)用AfxBeginThread创建一个WorkThreadProc的线程
AfxBeginThread(WorkThreadProc,event);
//4,在主程序需要的地方调用SetEvent()设置信号量启动线程
SetEvent(event);//或者用WaitForMultipleObjects函数
static UINT __stdcall WorkThreadProc(void* pThis);
//如果lParam参数为一个对话框的指针,想调用这个对话框的变量或函数那么就得这样定义线程函数,还要将WorkThreadProc改成//Wait_forDlg::WorkThreadProc,这样WorkThreadProc就成为CWait_forDlg类的函数,在这个线程里就可以调用该类的变量了,注意得用_beginthreadex函数创建线程
UINT CWait_forDlg::WorkThreadProc(void * lParam)
{
CWait_forDlg *pThis=(CWait_forDlg *)lParam;
HANDLE hObjects[2];
hObjects[0] = pThis->event1;
hObjects[1]= pThis->event2;
while(1)
{
DWORD dwWait = WaitForMultipleObjects(2,hObjects,TRUE,INFINITE);
//第一个参数为信号量个数2,第二个为指针,第三个如果为TRUE函数要等待两个信号量都被SetEvent才返回,返回值为最后一个
//SetEvent的WAIT_OBJECT_0+i;而为FALSE则只要有一个被SetEvent就返回,返回值为 WAIT_OBJECT_0+i 即信号量在数组中的位置
//+WAIT_OBJECT_0 */
if (dwWait == WAIT_OBJECT_0) AfxMessageBox("fcuk 1 ");
//开始ping
if (dwWait == WAIT_OBJECT_0 + 1)
AfxMessageBox("fcuk 2");
ResetEvent(hObjects[1]);
ResetEvent(hObjects[0]);
}
}
#include