2011-10-10program

本文探讨了编程中遇到的一些常见问题及其解决方案,包括控件风格修改、密码输入框设置、任务栏图标获取、等待光标使用不当及注册表应用程序信息获取等。文章提供了详细步骤与代码示例,帮助开发者解决实际编程难题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2011-10-10program
2011年10月10日
  1.使用ModifyStyleEx改变了控件风格无效
  答:修改之后,重绘一次,如果还不行的话,再试试看调用SetWindowPos(0,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_DRAWFRAME);
  2.动态设置编辑框的ES_PASSWORD无效
  答:修改之后,需要调用一次SetPasswordChar('*');
  3.如何获取任务栏小图标?
  答:有网友提出,能不能在程序界面上显示当前的托盘图标,这样更直观一些。这一点我也曾想到过,也知道奥秘就在TBBUTTON这个结构体的dwData域里面,可惜这个域的结构在MSDN中没有描述。我也曾试着发送TB_GETIMAGELIST消息获取image list的句柄,然后用CImageList::FromHandle加载到CImageList中,但却都失败了。
  在csdn网友的帮助下,我弄清了dwData的结构,其实dwData有一个这样的机构,我们命名为TRAYDATA:
  struct TRAYDATA
  {
  HWND hwnd;
  UINT uID;
  UINT uCallbackMessage;
  DWORD Reserved[2];
  HICON hIcon; //托盘图标的句柄
  };
  要获取到这个hIcon,其实很简单:
  //分配虚拟内存
  lngAddress = VirtualAllocEx(hProcess, NULL, sizeof(TBBUTTON), MEM_COMMIT, PAGE_READWRITE);
  //将hProcess进程内,地址为lngAddress中的内容(大小为sizeof(TBBUTTON))获取到tb中
  ret = ::ReadProcessMemory(hProcess, LPVOID(long(lngAddress)), &tb, sizeof(TBBUTTON), 0);
  //将hProcess进程内,地址为tb.dwData中的内容(大小为sizeof(TRAYDATA))获取到tray中
  ret = ::ReadProcessMemory(hProcess, LPVOID(tb.dwData), &tray, sizeof(TRAYDATA), 0);
  然后就可以用tray.hIcon索引到这个图标句柄了
  //释放内存代码略
  4.BeginWaitCursor和EndWaitCursor无效
  答:SetCapture();BeginWaitCursor();....EndWaitCursor();ReleaseCapture();
  5.打印源码中文件名和行号常用的宏名是什么?
  答:文件名:__FILE__ 行号:__LINE__
  6.如何具体判断一个字符串中哪个是英文字母
  答:函数isalpha
  7.在注册表中如何得到所有安装了的应用程序程序的信息
  答:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall下面的子
/** ****************************************************************************** * @file ADC/ADC1_DMA/main.c * @author MCD Application Team * @version V3.5.0 * @date 08-April-2011 * @brief Main program body ****************************************************************************** * @attention * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * * <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2> ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h" // 包含STM32F10x系列微控制器的外设寄存器定义等头文件 /** @addtogroup STM32F10x_StdPeriph_Examples * @{ */ /** @addtogroup ADC_ADC1_DMA * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #define ADC1_DR_Address ((uint32_t)0x4001244C) // 定义ADC1数据寄存器(DR)的地址 /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ ADC_InitTypeDef ADC_InitStructure; // 声明ADC初始化结构体变量 DMA_InitTypeDef DMA_InitStructure; // 声明DMA初始化结构体变量 __IO uint16_t ADCConvertedValue; // 用于存储ADC转换后的值,__IO表示volatile,确保每次从内存读取 /* Private function prototypes -----------------------------------------------*/ void RCC_Configuration(void); // 声明系统时钟配置函数 void GPIO_Configuration(void); // 声明GPIO配置函数 /* Private functions ---------------------------------------------------------*/ /** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file */ /* System clocks configuration ---------------------------------------------*/ RCC_Configuration(); // 调用系统时钟配置函数 /* GPIO configuration ------------------------------------------------------*/ GPIO_Configuration(); // 调用GPIO配置函数 /* DMA1 channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); // 复位DMA1通道1到默认状态 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; // DMA外设基地址设为ADC1数据寄存器地址 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue; // DMA内存基地址设为存储转换值的变量地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // DMA传输方向:外设作为数据源 DMA_InitStructure.DMA_BufferSize = 1; // DMA缓冲区大小为1(传输1个数据) DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 禁止外设地址自增 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; // 禁止内存地址自增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 外设数据宽度为半字(16位) DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // 内存数据宽度为半字(16位) DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // DMA工作在循环模式(传输完成后自动重新开始) DMA_InitStructure.DMA_Priority = DMA_Priority_High; // DMA通道优先级为高 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 禁止内存到内存传输模式 DMA_Init(DMA1_Channel1, &DMA_InitStructure); // 根据结构体配置DMA1通道1 /* Enable DMA1 channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); // 使能DMA1通道1 /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // ADC1工作在独立模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; // 启用扫描模式(多通道时需开启,单通道也可开启) ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 启用连续转换模式(转换完成后自动开始下一次) ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 不使用外部触发,采用软件触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // ADC数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; // 转换通道数量为1 ADC_Init(ADC1, &ADC_InitStructure); // 根据结构体配置ADC1 /* ADC1 regular channel14 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_55Cycles5); // 配置ADC1规则通道14:通道14,序列位置1,采样时间55.5个周期 /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); // 使能ADC1的DMA请求(ADC转换完成后触发DMA传输) /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); // 使能ADC1 /* Enable ADC1 reset calibration register */ ADC_ResetCalibration(ADC1); // 复位ADC1校准寄存器 /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); // 等待ADC1复位校准完成 /* Start ADC1 calibration */ ADC_StartCalibration(ADC1); // 开始ADC1校准 /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); // 等待ADC1校准完成 /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 软件触发ADC1开始转换 while (1) // 主循环,程序在此循环中运行 { } } /** * @brief Configures the different system clocks. * @param None * @retval None */ void RCC_Configuration(void) { #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) /* ADCCLK = PCLK2/2 */ RCC_ADCCLKConfig(RCC_PCLK2_Div2); // 对于低/中/高密度超值型芯片,ADC时钟设为PCLK2的1/2 #else /* ADCCLK = PCLK2/4 */ RCC_ADCCLKConfig(RCC_PCLK2_Div4); // 对于其他类型芯片,ADC时钟设为PCLK2的1/4 #endif /* Enable peripheral clocks ------------------------------------------------*/ /* Enable DMA1 clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 使能DMA1时钟(DMA1挂载在AHB总线上) /* Enable ADC1 and GPIOC clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE); // 使能ADC1和GPIOC时钟(均挂载在APB2总线上) } /** * @brief Configures the different GPIO ports. * @param None * @retval None */ void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; // 声明GPIO初始化结构体变量 /* Configure PC.04 (ADC Channel14) as analog input -------------------------*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 配置PC4引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 引脚模式设为模拟输入(用于ADC采样) GPIO_Init(GPIOC, &GPIO_InitStructure); // 根据结构体配置GPIOC } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t* file, uint32_t line) { /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* Infinite loop */ while (1) { } } #endif /** * @} */ /** * @} */ /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
07-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值